指针和数组的千丝万缕(三)
假设在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调试下来验证。
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