2017-03-26 76 views
1

執行時的以下代碼給出的輸出爲'6'。數組地址地址

#include<stdio.h> 

int main() 
{ 
     int a[]={7,5,3,4,1,6}; 
     int *ptr=(int*)(&a+1); 
     printf("%d",*(ptr-1)); 
     return (0); 
} 

我不明白什麼是行的一部分 「(INT *)(&一個+ 1)」 的意思。

+0

它的意思是「我不害怕未定義的行爲,我投擲直到它編譯。」不是你應該做的。 –

回答

0

,如果你畫出來可能更容易理解:

 
+---+---+---+---+---+---+---- 
| 7 | 5 | 3 | 4 | 1 | 6 | ... 
+---+---+---+---+---+---+---- 
^     ^^
|     | | 
&a     | &a + 1 
        | | 
        | ptr 
        | 
        ptr - 1 

也就是說,你從&a + 1得到的指針指向超出數組的結束。

另一件很好的事情是,對於任何指針(或數組)ptr和索引i,表達式*(ptr + i)等於ptr[i]。所以當你做(*ptr - 1)你真的在做ptr[-1]這正好是6,之前的元素ptr[0]

1

a是一組6int。因此「&a」是類型「指向6int」或(在C++語法中)int (*)[6]的指針。因此

&a + 16int一個(不存在)數組,它是在存儲器立即過去的a端部的地址。

(int *)(&a + 1)轉換爲&a + 1的值,因此它的類型爲int *。這給出了一個int的地址,該地址在a的末尾。形式上&a + 1(int *)(&a + 1)具有相同的VALUE,但類型不同。因此

ptr - 1給出a的最後一個元素的地址,並且因此打印*(ptr - 1)給出值6(這是a最後一個元素的值)。

+0

但是'a'本身不是指針/地址嗎?如果是,那麼指針的地址是什麼意思? – Eru

+0

編號'a'是一個數組。指針是一個包含地址的變量。一些 - 但不是全部 - 操作在「數組X」和「指向X的指針」(其中X是類型)上給出相同的結果,但這並不意味着「數組是指針」,也不意味着「一個指針是一個數組「。 – Peter