请注意,如果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
答案 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);
然后继续它的编译工作