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?指針轉換後指針的運算如何?
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?指針轉換後指針的運算如何?
嗯,明白爲什麼*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
端,你首先要輸入你的計算器)
爲什麼你認爲鑄造確實會改變指針算術的行爲? – Olaf
請注意,解除引用'p'或'p + 1'是未定義的行爲。我們可以解釋這種未定義的行爲如何在您的特定情況下顯現出來,但它可以在稍微不同的情況下做完全不同的事情。 – user2357112
啓用壓縮機警告並注意它們。你調用未定義的行爲。很高興你的電腦沒有跳出窗口。 – Olaf