c - 为什么要声明一个数组类型的参数?

标签 c arrays pointers coding-style

根据“Difference between passing array and array pointer into function in C”,这两种声明参数的方式之间没有语义差异,因为“数组参数 [are being] treated as if they was declared as pointers”。

void f1(int a[]) { /* ... */ }
void f2(int* a)  { /* ... */ }

然而,处理数组和指针之间有很大的不同。例如,可以使用 sizeof(some_array) 找出数组的大小。但是,在处理指针时,这只会显示指针本身的大小。 (旁注:This 是关于该问题的一个非常巧妙的解决方法。)

这就是为什么我发现像这样声明参数会产生误导:f1(int a[])。正如 djechlin 在“Difference between array and pointer as a function's argument in c”中指出的那样,我认为它可以让人误以为实际上是在处理数组而不仅仅是指针:“因此我总是更喜欢指针形式,因为数组形式会引起微妙的混淆。”

话虽如此,我想知道为什么人们继续使用“数组形式”,因为似乎没有理由这样做。我在这里错过了什么?在他的书中Learn C The Hard Way , Zed Shaw实际上混合了两种方式:

void print_arguments(int argc, char *argv[]) { /* ... */ }

他们也在 K&R2 中这样做。

为什么?我很清楚不这样做的原因,但好处是什么?

最佳答案

从技术上讲,我不知道有什么原因,但从语义上讲,意思要清楚得多。

如果我看到一个函数接受指向某物的指针,我希望它是一个单独的项目,除非变量名(和/或可能的函数名)清楚地表明它将期待一个数组。

而如果它被标记为采用数组,那是很明显的。对于多个 ** 尤其如此 - 以 char *argv[] 为例。这显然是指向 char*(即字符串)数组的指针。 char **argv 可以是那个,但它也可以是一个可变指针(例如用于释放)。虽然 char argv[][] 会暗示一个二维数组(char *argv[] 不是)。

关于c - 为什么要声明一个数组类型的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22917558/

相关文章:

c - printf 添加数字

C:两个数组相除

c - 在 C 中使用 scanf() 从 stdin 读取输入

c - 在 C 的另一个结构中初始化和访问嵌套的 struct char 指针

c - 在结构中的数组末尾填充

c - 初始化错误

c - 如何存储 char* 的值?

c - 如何在 C 中初始化指向指针的指针

c - 为什么数组不从最后一个数字插入的地方继续?

javascript - 使用 for 循环时,Javascript 中的洪水填充算法不会填充整个网格