foo(int arr[])和foo(int arr[10])之间有什么区别?

5
有没有任何区别在C语言中的两个函数之间?
void f1(int arr[]) {    
//some code...  
}
void f2(int arr[10]) {
//some code
}

f1函数中第一个数组的大小是多少?


4
除了第二种情况有点自解释外,两种情况没有区别。无论哪种情况,arr 都会衰变成指针。 - Paul R
好的,你可以进行一些测试,尝试使用 printf("sizeof arr == %d\n", sizeof arr); 并查看会发生什么。 - Luis Colorado
2个回答

6
在C语言中,这两个函数没有区别。由于数组被转换为指向其第一个元素的指针,当作为函数参数时,编译器会将它们都解释为int *arr
在f1函数中,严格来说并没有数组。它只是一个指向int的指针。如果你使用sizeof(arr),那么你将得到与sizeof(int *)相等的值。
当参数类型为指向数组的指针时,需要指定数组大小。在这种情况下,必须指定每个长度以使指针指向不同的类型。
void f3(int (*arr)[10]); // Expects a pointer to an array of 10 int

哪一个是最佳实践,void f1(int arr[10])、void f2(int arr[])还是void f3(int (*arr)([10]))? - Tony Stark
这是一个选择的问题,但 f3(int (*arr)([10])) 是完全不同的,你不能用它来代替 f1(int arr[10])(或者 f2(int arr[]))。 - haccks
f3(int (*arr)([10]))与另外两个有什么不同? - Tony Stark
f3 中,arr 是一个指向包含 10 个 int 的数组的指针,而在另外两个函数中,它是一个指向 int 的指针。 - haccks

4

当一个数组被传递到一个函数中时,它会衰减成为指向数组第一个元素的指针。

因此,这样做:

void f1(int arr[])

And this:

void f1(int arr[10])

还有这个:

void f1(int *arr)

所有这些都是等价的。

实际上,如果您将 int a[20] 传递给声明为接受 int arr[10] 的函数,gcc 不会报错。


1
重要的是,如果您将 int a[5] 传递给声明为接受 int arr[10] 的函数,则编译器仍然不会抱怨。 最多,显式维度是向程序员提供有关函数期望的建议。 它不会被符合规范的编译器强制执行。 - John Bollinger
严谨地说,数组表达式在任何时候(不仅仅是作为函数参数传递时)都会被转换为指针表达式,除非它是 sizeof 或一元 & 运算符的操作数,或者是用于声明中初始化数组的字符串字面量。 - John Bode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接