有没有任何区别在C语言中的两个函数之间?
void f1(int arr[]) {
//some code...
}
void f2(int arr[10]) {
//some code
}
f1函数中第一个数组的大小是多少?
int *arr
。int
的指针。如果你使用sizeof(arr)
,那么你将得到与sizeof(int *)
相等的值。void f3(int (*arr)[10]); // Expects a pointer to an array of 10 int
f3(int (*arr)([10]))
是完全不同的,你不能用它来代替 f1(int arr[10])
(或者 f2(int arr[])
)。 - haccksf3
中,arr
是一个指向包含 10 个 int
的数组的指针,而在另外两个函数中,它是一个指向 int
的指针。 - haccks当一个数组被传递到一个函数中时,它会衰减成为指向数组第一个元素的指针。
因此,这样做:
void f1(int arr[])
And this:
void f1(int arr[10])
还有这个:
void f1(int *arr)
所有这些都是等价的。
实际上,如果您将 int a[20]
传递给声明为接受 int arr[10]
的函数,gcc 不会报错。
int a[5]
传递给声明为接受 int arr[10]
的函数,则编译器仍然不会抱怨。 最多,显式维度是向程序员提供有关函数期望的建议。 它不会被符合规范的编译器强制执行。 - John Bollingersizeof
或一元 &
运算符的操作数,或者是用于声明中初始化数组的字符串字面量。 - John Bode
arr
都会衰变成指针。 - Paul Rprintf("sizeof arr == %d\n", sizeof arr);
并查看会发生什么。 - Luis Colorado