9

这是一个示例程序:

#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

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

4

2 回答 2

12
  1. 它是语法糖:void foo(int b[])建议b将其用作数组(而不是单个输出参数),即使它确实是一个指针。

  2. 它是 C 早期版本的遗留物,其中 postfix[]是指针声明的语法。

于 2012-05-11T15:02:53.527 回答
0

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

在这种情况下,因为您将数组作为参数传递,所以 C 已经创建了一个指向给定地址的指针 - 然而,真正有趣的情况是当您在堆栈上分配一个数组并仅在此处使用它时会发生什么。

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

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

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

于 2012-05-11T15:07:56.887 回答