`sizeof`如何区分指针和数组?

时间:2015-05-17 07:57:28

标签: c sizeof

请注意,如果a是数组名称,则sizeof(a)将生成整个数组a的大小,而不是指向其中一个元素的指针的大小。

例如,sizeof如何区分数组a和指针b

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int a[4] = {1, 2, 3, 4};
  int *b = a;
  printf("sizeof\(a) = %ld\n", sizeof(a));
  printf("sizeof\(b) = %ld\n", sizeof(b));
  return EXIT_SUCCESS;
}

打印如下:

sizeof(a) = 16
sizeof(b) = 8

2 个答案:

答案 0 :(得分:8)

sizeof编译时运算符。它由编译器计算(并且几乎总是常量,VLA是例外)。

编译器显然知道变量何时引用数组或指针,因为它必须知道每个变量的类型(并且数组类型与指针类型不同)。

请注意,在C中,数组可以decay到指针中(例如,当您将数组作为参数传递给例程时)。这是C语言中最棘手的一点(如果你不理解它,请深入研究C编程书)。

答案 1 :(得分:1)

编译器会密切关注您在代码中定义的每个名称(数组,整数,指针......),它的地址及其大小,并将其保存在表格中其他信息。因此,当您使用sizeof运算符时,编译器只是将表达式替换为该名称的大小,并使用硬编码的数字编译您的程序:操作数的大小,这就是为什么您可以&#39 ; t在运行时使用sizeof动态大小的结构。 因此,在您的示例中,编译器具有类似

的表

姓名____地址____大小______(其他事项)

a _____ 1000 _____ 16 _____(阵列)&lt;&lt;&lt;

b _____ 1016 _____ 8 _____.....

.._____ 1024 _____.._____.......

当你使用像

这样的表达式时
printf("sizeof\(a) = %ld\n", sizeof(a));

编译器将使用

替换它(在其中一个转换阶段)
printf("sizeof\(a) = %ld\n", 16);

然后继续它的编译工作