[英]Why the size differs? sizeof(a) vs sizeof(&a) of an array?
對於下面的代碼。
int a[4];
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));
output 是
16
8
'a' 代表整個數組(也是數組的第一個元素的地址,因為它是一維數組),sizeof(a) 代表整個數組的大小。 因此大小是 16。明白了。
'&a' 代表整個數組的地址,而sizeof(&a) 代表什么?
我猜它的 output 是 8 因為該值是一個地址並計算固定指針的大小? 因此 8. 我是對的嗎?
但是我還是沒搞清楚。 任何人都可以幫忙給出一個明確的解釋嗎?
因為,它們的類型不同,並且sizeof
運算符對類型進行操作。
首先, sizeof
運算符產生size_t
類型的結果。 您應該使用%zu
格式說明符來打印結果。
也就是說,在這種情況下, a
是數組(這是一個特定的用例,其中數組不會“衰減”),因此,它將大小計算為元素數量乘以每個元素的大小。 在您的情況下, int
的大小應該是4
,因此您得到4*4
, 16
。 為了便於理解,以下打印語句類似:
printf("%zu\n",sizeof(a));
printf("%zu\n",sizeof(int[4])); // same as above
另一方面, &a
表示數組的地址,該地址是一個指針,類型為int (*)[4]
。 同樣,您的系統似乎使用 8 個字節作為指針大小,因此是 output。 為了比較,我們可以寫
printf("%zu\n",sizeof(&a));
printf("%zu\n",sizeof(int(*)[4])); // same as above
表達式&a
返回一個指向a
的指針。
系統中指針的大小為8
個字節。
我猜它的 output 是 8 因為該值是一個地址並計算固定指針的大小? 因此 8. 我是對的嗎?
是的 -表達式&a
產生一個指向a
的指針,它的類型為int (*)[4]
(指向int
的 4 元素數組的指針)。 在您的系統上,該指針類型為 8 個字節寬。
所以,
sizeof a == sizeof (int [4]) == 16
sizeof &a == sizeof (int (*)[4]) == 8
sizeof *a == sizeof a[0] == sizeof (int) == 4
不同的指針類型可能有不同的大小,但在大多數桌面和服務器系統上,所有 object 指針的大小都相同(4 或 8 字節,具體取決於架構)。
旁注: sizeof
是運算符,而不是 function - 僅當操作數是類型名稱時才需要括號。 寫sizeof (a)
而不是sizeof a
並沒有什么壞處,我知道這里有些人推薦它,但我個人傾向於不這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.