2011-10-13 82 views
8

如果我有一個數組聲明如下:SIZEOF指針數組

int a[3][2]; 

那麼爲什麼:

sizeof(a+0) == 8 

而:

sizeof(a) == 24 

我不明白怎麼加0指針更改sizeof輸出。是否有一些隱式類型轉換?

回答

12

如果添加0a,然後a首先被轉換爲int(*)[2]類型(指向型int[3][2]的陣列的第一個元素)的指針值。然後0被添加到那,它將0 * sizeof(int[2])字節添加到由該指針值表示的地址。由於該乘法產生0,它將產生相同的指針值。由於它是一個指針,因此sizeof(a+0)會產生一個指針的大小,這個指針的大小是8個字節。

如果你這樣做sizeof(a),編譯器沒有理由將a轉換爲指針值(這隻有在您想要索引元素或執行涉及元素地址的指針算法時纔有意義)。因此表達式a保持爲數組類型,並且您獲得的大小爲int[3][2],而不是int(*)[2]的大小。所以,3 * 2 * sizeof(int)在你的盒子上是24字節。

希望澄清一些事情。

+0

調用'sizeof(a + 0)'與做sizeof(a [0])'相同,它取得數組中第一個'int [2]'元素的大小,所以'sizeof( int)* 2 = 8'。它不佔用指針的大小。 –

+0

@Remy我會很感激,如果你會制定這個理論並將其作爲論文發佈 –

+2

@ RemyLebeau-TeamB:'a [0]'相當於'*(a + 0)',而不是'(a + 0) 。 –

0

sizeof告訴你表達式類型的大小。當您將0添加到a時,類型將變爲指針(64位系統上的8個字節)。