[英]How does `sizeof` distinguish a pointer from an array?
請注意,如果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
編譯器會密切關注您在代碼中定義的每個名稱(數組,整數,指針......),它的地址和大小,並將其與其他信息一起保存在表中。 因此,當您使用sizeof
運算符時,編譯器只是將表達式替換為該名稱的大小,並使用硬編碼的數字編譯您的程序:操作數的大小,這就是為什么您不能動態使用sizeof
原因運行時大小的結構。 因此,在您的示例中,編譯器具有類似的表
name ____ address ____ size _____....(其他)
a _____ 1000 _____ 16 _____(陣列)<<<
b _____ 1016 _____ 8 _____.....
.._____ 1024 _____.._____.......
當你使用像這樣的表達式時
printf("sizeof\(a) = %ld\n", sizeof(a));
編譯器將替換它(在其中一個翻譯階段)
printf("sizeof\(a) = %ld\n", 16);
然后繼續它的編譯工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.