C Language: Pointer type and Data Type

很久沒有好好的看一下C語言的東西
這次有發現到一件很重要但是我不知道的事
原來Pointer的Type會影響去讀取資料的偏移量
看下面這個簡單的例子就知道我對於C語言真的是很不熟


void main(void)
{
 int x;
    int a[5] = {0x11121314, 0x21222324, 0x31323334, 0x41424344, 0x51525354};

    for (x = 0; x < 20; x++) {
        printf("%02x ", *(char *)((int)(&a) + x));
    }
    printf("\n");
    for (x = 0; x < 8; x++) {
        printf("%08x ", *(int *)((int)(&a) + x));
    }
    printf("\n");

}

有興趣的人可以自己想一下再看下面的答案



這邊對我自己來說有兩個重點

  1. ((int)(&a) + x))在這邊的code中為什麼要強制轉成 int,原來是不強制轉型的話,會在做+1後直接跳到&a+20byte(0x14)的位置,加上int後會正確的+1byte
  2. *(char *)這邊會將上面得到的Address透過char type pointer抓值出來print,因為char的type是一個byte,所以pointer下一次會offset 1byte 去抓值, 而*(int *)因為int的size有 bytes,所以pointer下一次會offset 4byte抓值。

看了好久才看懂一點點,這邊做個筆記,下次再看更深入一點 

留言

  1. 這個寫法很詭異 gcc 4.5會compile error.

    另外 &a+1後應該是跳到4個byte之後不是20個byte吧?等於是跳到a[5]的位置;我沒搞懂轉成int的意思是什麼 不過編譯也不過



    回覆刪除

張貼留言