1. 程式人生 > >關於對 (char *)字元指標強制轉換型別的一些理解

關於對 (char *)字元指標強制轉換型別的一些理解

關於 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…

問題,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