以下是一个示例程序:
#include <stdio.h>
void foo(int b[]){
printf("sizeof in foo: %i\n", sizeof b);
}
int main(){
int a[4];
printf("sizeof in main: %i\n", sizeof a);
foo(a);
}
输出结果为:
sizeof in main: 16
sizeof in foo: 8
问题是,如果它只是在函数边界转换为标准指针,该语法的意义是什么?
答案 0 :(得分:12)
这是语法糖:void foo(int b[])
表明b
将被用作数组(而不是单个out-parameter),即使它确实是一个指针。
这是early versions of C的遗留问题,其中postfix []
是指针声明的语法。
答案 1 :(得分:0)
问题是,如果它只是在函数边界转换为标准指针,该语法的意义是什么?
在这种情况下,因为你将数组作为参数传递C已经创建了一个指向给定地址的指针 - 但是,真正有趣的情况是当你在堆栈上分配一个数组时会发生什么,并且只在那里使用它
当你这样做时,编译器然后将该数组的load语句转换为指针加偏移量,但直接访问堆栈基数+偏移量 - 为什么不呢?无论如何都存储指针是没有意义的。
但是,当涉及到传递该数组时,编译器会将数组基址的地址传递给函数 - 作为指针。
简而言之,[]
可以帮助您更好地进行指针运算。在声明数组的情况下,它可以被优化掉 - 这就是为什么数组不是指针,尽管它们在某些情况下通过指针访问(而不是在其他情况下)。