簡體   English   中英

Sizeof&a vs * a

[英]Sizeof &a vs *a

我徹底搜索但找不到解決方法:假設sizeof(int) = 4 ,我們定義:

int a[10] = {0};

以下是什么輸出:
sizeof(&a)
2. sizeof(*a)
3. sizeof(a)

我知道sizeof(a)等於sizeof(int) * 10 = 40
我也明白*a實際上是數組中的第一個元素,因此sizeof(*a)實際上是駐留在那里的int大小,即4

但是,運行代碼后,我不明白為什么&a大小為8 我知道'&'運算符返回變量a的地址,但為什么地址的sizeof8

地址的大小取決於您的體系結構,並且與int本身的大小沒有直接關系。 所以在你的情況下它是8,這似乎很正常(64位)。

理解這一點的關鍵是要知道,只要在表達式中使用數組,數組通常會“衰減”為指向第一個元素的指針。 除了一些特殊情況。 數組衰減規則和例外情況見C標准(C17 6.3.2.1/3):

除非它是sizeof運算符或一元&運算符的操作數,或者是用於初始化數組的字符串文字,否則將類型為''array of type''的表達式轉換為類型為''指針的表達式鍵入''指向數組對象的初始元素,而不是左值。

我們可以看到, sizeof&是規則的例外。

這意味着asizeof(&a)不衰減的指針。 我們可以知道這一點,因為sizeof和一元&都是具有相同預設的一元運算符,但具有從右到左的運算符關聯性。 這意味着&a首先被解釋,並且在使用&時沒有數組衰減。

所以我們得到了數組的地址。 在您的情況下, int(*)[10]類型的int指針的大小。 指針獲得的大小與int的大小無關,但在32位和64位系統上可能分別為4或8個字節。

sizeof(*a) &a情況下,就像在&a case中一樣,一元運算符的從左到右的關聯性意味着*a首先被解釋。 因此,在應用sizeof之前,數組會衰減為指向第一個元素的指針。 所以*a給出了第一個元素的大小,即int的大小。

最后,在sizeof(a)情況下,沒有數組衰減,因為asizeof使用,並且不存在其他運算符。 意思是我們得到整個數組的大小。

sizeof &a == sizeof (int (*)[10]) // pointer to 10-element array of int
sizeof *a == sizeof a[0] == sizeof (int)
sizeof  a == sizeof (int [10])

並且只是為了完成

 sizeof &a[0] == sizeof (int *)

所有這些尺寸都取決於底層平台。 指針類型大小不依賴於指向類型的大小( intint *的大小之間沒有關系)。 不同的指針類型可能有不同的大小 - 唯一的要求是:

  • char *void *具有相同的大小和對齊方式;
  • 指向限定類型​​的指針具有與其非限定等價物相同的大小和對齊方式(例如, sizeof (const int *) == sizeof (int *) ;
  • 所有struct指針類型都具有相同的大小和對齊方式;
  • 所有union指針類型都具有相同的大小和對齊方式;

在您可能遇到的任何現代桌面或服務器系統上(讀取:x86),所有對象指針類型都具有相同的大小和對齊方式。 請注意,那里有奇怪的架構可能並非如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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