簡體   English   中英

`sizeof`如何區分指針和數組?

[英]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算符。 它由編譯器計算(並且幾乎總是常量, VLA是例外)。

編譯器顯然知道變量何時引用數組或指針,因為它必須知道每個變量的類型(並且數組類型與指針類型不同)。

請注意,在C中,數組可以衰減為指針(例如,當您將數組作為參數傳遞給例程時)。 這是C語言中最棘手的一點(如果你不理解它,那就深入研究C編程書)。

編譯器會密切關注您在代碼中定義的每個名稱(數組,整數,指針......),它的地址和大小,並將其與其他信息一起保存在表中。 因此,當您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM