在函数参数列表中声明字符指针和字符数组有什么区别?



两者有什么区别

foo(char* grid){}

foo(char grid[]){}

我有一个程序,我在函数参数的两种样式上都进行了测试。 它似乎有效,但为什么有效?有什么区别?哪一个更有效率,第一个通过参考吗?

在函数参数的情况下(并且仅在这种情况中(,它们的含义相同。

请注意,C99 删除了"隐式int"规则,因此您的示例应如下所示:

void foo(char* grid){}

void foo(char grid[]){}

使用数组类型定义的参数被"调整"为指针类型的参数,指向数组的元素类型。

参考:N1570 6.7.6.3 第7段。(这是2011年ISO C标准的免费草案,PDF,1.7 MB。

(在所有其他上下文中,指针声明和数组声明是不同的。请参阅 comp.lang.c FAQ 的第 6 节。

C 中的所有参数都是按值传递的,而不是按引用传递的。在这种情况下,传递的值恰好是指针值,即char对象的地址。 例如,如果您编写:

char arr[10];
func(arr);

然后传递的值是&arr[0](有一个单独的语言规则说数组表达式在大多数但不是所有上下文中被转换/调整为指针表达式(。 请注意,不会传递有关数组长度的信息;如果要跟踪它,则必须明确执行此操作。

C 没有按引用传递作为语言功能。 传递指针值是模拟按引用传递的一种方法。

最新更新