執行時的以下代碼給出的輸出爲'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)」 的意思。
執行時的以下代碼給出的輸出爲'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)」 的意思。
,如果你畫出來可能更容易理解:
+---+---+---+---+---+---+---- | 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]
。
a
是一組6
int
。因此「&a
」是類型「指向6
int
」或(在C++語法中)int (*)[6]
的指針。因此
&a + 1
是6
int
一個(不存在)數組,它是在存儲器立即過去的a
端部的地址。
(int *)(&a + 1)
轉換爲&a + 1
的值,因此它的類型爲int *
。這給出了一個int
的地址,該地址在a
的末尾。形式上&a + 1
和(int *)(&a + 1)
具有相同的VALUE,但類型不同。因此
ptr - 1
給出a
的最後一個元素的地址,並且因此打印*(ptr - 1)
給出值6
(這是a
最後一個元素的值)。
它的意思是「我不害怕未定義的行爲,我投擲直到它編譯。」不是你應該做的。 –