對于下面的代碼。
int a[4];
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(&a));
輸出是
16
8
'a' 代表整個陣列(也是陣列的第一個元素的地址,因為它是一維陣列),sizeof(a) 代表整個陣列的大小。因此大小是 16。明白了。
'&a' 代表整個陣列的地址,而sizeof(&a) 代表什么?
我猜它的輸出是 8 因為該值是一個地址并計算固定指標的大小?因此 8. 我是對的嗎?
但是我還是沒搞清楚。任何人都可以幫忙給出一個明確的解釋嗎?
uj5u.com熱心網友回復:
因為,它們的型別不同,并且sizeof
運算子對型別進行操作。
首先,sizeof
運算子產生型別的結果size_t
。您應該使用%zu
格式說明符來列印結果。
也就是說,在這種情況下,a
是陣列(這是一個特定的用例,其中陣列不會“衰減”),因此,它將大小計算為元素數量乘以每個元素的大小。在您的情況下, an 的大小int
應該是4
,所以您得到4*4
, 16
。為了便于理解,以下列印陳述句類似:
printf("%zu\n",sizeof(a));
printf("%zu\n",sizeof(int[4])); // same as above
另一方面,&a
表示陣列的地址,該地址是一個指標,型別為int (*)[4]
。同樣,您的系統似乎使用 8 個位元組作為指標大小,因此是輸出。為了比較,我們可以寫
printf("%zu\n",sizeof(&a));
printf("%zu\n",sizeof(int(*)[4])); // same as above
uj5u.com熱心網友回復:
該運算式&a
回傳一個指向 的指標a
。
系統中指標的大小 是8
位元組。
uj5u.com熱心網友回復:
我猜它的輸出是 8 因為該值是一個地址并計算固定指標的大小?因此 8. 我是對的嗎?
是的 -運算式 &a
產生一個指向 的指標a
,它具有型別int (*)[4]
(指向 4 元素陣列的指標int
)。在您的系統上,該指標型別為 8 個位元組寬。
所以,
sizeof a == sizeof (int [4]) == 16
sizeof &a == sizeof (int (*)[4]) == 8
sizeof *a == sizeof a[0] == sizeof (int) == 4
不同的指標型別可能有不同的大小,但在大多數桌面和服務器系統上,所有物件指標的大小都相同(4 或 8 位元組,具體取決于架構)。
旁注:sizeof
是運算子,而不是函式 - 僅當運算元是型別名稱時才需要括號。改寫并沒有什么壞處,我知道這里有些人推薦它,sizeof (a)
但sizeof a
我個人傾向于不這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506457.html
上一篇:指標比較
下一篇:C二進制檔案處理