關於對 (char *)字元指標強制轉換型別的一些理解
阿新 • • 發佈:2019-01-30
關於 char * 的問題我在下面的兩篇博文中均有提及,如果本文看了不夠爽的,可盡情翻閱我的這兩篇,相信您的感受定會如我一般。
真TM神奇
宣告:short 在我的機器中是2個位元組。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
short p = 1;
printf("%d\n", p);
printf("%p\n", &p);
((char *)&p)[0] = 0;
printf ("%d\n", p);
printf("%p\n", &p);
((char *)&p)[1] = 2;
printf("%d\n", p);
printf("%p\n", &p);
((char *)&p)[2] = 3;
printf("%d\n", p);
printf("%p\n", &p);
((char *)&p)[3] = 4;
printf("%d\n", p);
printf("%p\n", &p);
return 0;
}
然後接著往下走
是時候理解一波程式碼的具體意思了,
((char *)&p)[0] = 0;
先取short型別的p(記憶體中兩個位元組)的低地址,0xff0e 0xff0f。然後強制轉換為 (char *) 即字元指標(記憶體中四個位元組),所以此時p的記憶體地址為 0xff0e 0xff0f 0xff10 0xff11
緊接著((char *)&p)[0] = 0; 取地址偏移量為[0]的位置並把它賦值為0。我們開啟記憶體映象看一下是不是這樣。
必須的!!!
然後,同上面的分析一樣,我們看接下來的[1] [2] [3]如何。。。
完美吻合有沒有,,哈哈哈哈哈。。。
但是結果為什麼是512呢,
我們知道雖然強制轉換為(char *)但是本質還是 short
言外之意佔的還是兩個位元組,這樣就會自己捨去高位元組。留下低位兩個位元組的資料。也就是 0000 0010 0000 0000 就是2的九次方。。512…
第一步:short p = 1;
p變為
00000000 00000001
第二步:((char*)&p)[0] = 0;
((char*)&p)[0]對應的位置
↓
00000000 00000001
所以p變為
00000000 00000000
第③步:((char*)&p)[1] = 2;
((char*)&p)[0]對應的位置
↓
00000000 00000001
所以p變為
00000010 00000000(這個值就是512了,即2^10)
第④步:((char*)&p)[2] = 3;
((char*)&p)[0]對應的位置
已經超出範圍
所以並不會改變p的值
第⑤步:((char*)&p)[3] = 4;
和上面一樣
還能學到一個新東西,就是陣列的[]比如,char *p, 那麼p[0],就相當於&p