如果丢弃长度数据,C的数组语法有什么意义?

时间:2012-05-11 15:00:18

标签: c arrays syntax

以下是一个示例程序:

#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

问题是,如果它只是在函数边界转换为标准指针,该语法的意义是什么?

2 个答案:

答案 0 :(得分:12)

  1. 这是语法糖:void foo(int b[])表明b将被用作数组(而不是单个out-parameter),即使它确实是一个指针。

  2. 这是early versions of C的遗留问题,其中postfix []是指针声明的语法。

答案 1 :(得分:0)

  

问题是,如果它只是在函数边界转换为标准指针,该语法的意义是什么?

在这种情况下,因为你将数组作为参数传递C已经创建了一个指向给定地址的指针 - 但是,真正有趣的情况是当你在堆栈上分配一个数组时会发生什么,并且只在那里使用它

当你这样做时,编译器然后将该数组的load语句转换为指针加偏移量,但直接访问堆栈基数+偏移量 - 为什么不呢?无论如何都存储指针是没有意义的。

但是,当涉及到传递该数组时,编译器会将数组基址的地址传递给函数 - 作为指针。

简而言之,[]可以帮助您更好地进行指针运算。在声明数组的情况下,它可以被优化掉 - 这就是为什么数组不是指针,尽管它们在某些情况下通过指针访问(而不是在其他情况下)。