指针和数组的千丝万缕(三)

假设在x86(小端)上运行以下代码:
char undata[100];
short out,i;
for(i=0; i<100; i++)
    undata[i] = i;
out = *(short*)((int*)undata + 1);

咋一看最后一句,还真是有点晕,一会儿int*,一会儿short*不过仔细分析以下,还是有头绪的。
话说执行完for循环之后,数组undata的值就变为0,1,2,3,4,5,6,......97,98,99;每一个元素均占用一个(char)字节大小。(int*)undata是把这100个数字在整合成以int类型的数组,就是把0,1,2,3整合为一个数组来访问,4,5,6,7整合为一个数组来访问,一次类推,而内存里的数是不变的,只是编译器在访问的时候均已一个int类型大小的跨度来访问,那么可以看成(100/4)25个int类型的元素了。
在CPU=x86,OS=winxp,compiler=mingw32,通过GDB调试下来验证。

这里undate的地址为0x22ff08,下面的调试显示了一切!


还有记住在x86的架构里,数据均已小端的方式存储的,就是我常提到的“小低低(弟弟)”,且看下面:

数据

D

00000000

10000000

01000000

11000000

00100000

10100000

01100000

11100000

00010000

B

0

1

2

3

4

5

6

7

8

 

address

0x22ff08

0x22ff09

0x22ff0a

0x22ff0b

0x22ff0c

0x22ff0d

0x22ff0e

0x22ff0f

0x22ff10

 

 

int

int

 

 

 

short

 

 

short

 

 

 

然后out=0000 0101 0000 0100 = 2^10+2^8+2^2 = 1284

posted @ 2012-07-09 15:55  wdliming  阅读(98)  评论(0编辑  收藏  举报