2013年11月21日 星期四

[觀點][C語言]array搭配強制型別轉換的pointer, 當轉換小型別轉成大型別的時候, 位址會跟著變, 還有int的加減法和char不同, 單位會是4

#include <stdio.h>

char ary[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
char *p1 = ary;
char *p2;
int *pn;

void test()
{
    p1+=2;                  //p1[0] = 2     
    pn = (int*)&p1[2];     //p1[2] = 4, char->int之後,pn[0] = 7
    pn+=1;                  //加完之後pn[0] = 8
    p1 = (char*)pn;        //pn從int->char,還是維持在原位,所以p1[0]=8
    --pn;                   //因為pn是int型別,做加減法會位移4個byte而不是1個byte,所以pn[0]=4
    p2 = (char*)pn;        //int->char不會縮減,所以p2[0]=4
    --p2;                   //p2是char,所以只會減1個byte,p2[0]=3
}

int main()
{
    test();
    printf("*p1 = %d *p2= %d\n", *p1, *p2);
    return 0;
}
[answer]
*p1 = 8 *p2= 3

1 則留言:

  1. 您好
    想請教您:
    pn = (int*)&p1[2]; //p1[2] = 4, char->int之後,pn[0] = 7
    這一行中 char->int 主要的位址是如何改變的
    看蠻久還是搞不太清楚
    麻煩您了 謝謝

    回覆刪除