2016-02-01 37 views
-9
int main() { 
    short int a[4] = {1,1, [3] = 1}; 
    int *p = (int*)a; 

    printf("p: %p %d \n ", p, *p); 
    printf("p+1: %p %d\n", (p +1), *(p+1)); 
} 

爲什麼* p = 65537和*(p + 1)= 65536?指針轉換後指針的運算如何?

+1

爲什麼你認爲鑄造確實會改變指針算術的行爲? – Olaf

+0

請注意,解除引用'p'或'p + 1'是未定義的行爲。我們可以解釋這種未定義的行爲如何在您的特定情況下顯現出來,但它可以在稍微不同的情況下做完全不同的事情。 – user2357112

+0

啓用壓縮機警告並注意它們。你調用未定義的行爲。很高興你的電腦沒有跳出窗口。 – Olaf

回答

-1

嗯,明白爲什麼*P是65537和*(p+1)爲65536讓我們來看看內存:

00000001 00000000 | 00000001 00000000 | 00000000 00000000 | 00000001 00000000 

我用一個空格分割字節,並通過一個單一的short int |。現在,我們投的PTR到int*,現在需要四個字節而不是兩個:

00000001 00000000 00000001 00000000 | 00000000 00000000 00000001 00000000 

如果你輸入的二進制文件到你的計算器,讓它告訴你十進制表示你究竟得到這些數字。 (這就是小端,所以最右邊的字節是big端,你首先要輸入你的計算器)

+0

是的!而已!!非常感謝你tkausl! –

+0

這個解釋沒有必要。一旦你調用UB,所有投注都關閉。 – Olaf

+0

我認爲在我的情況下,其解釋是最好的我可以得到 –