刚才看到这个问题, 这里记录一下。
int arr[5]={1,2,3,4,5};
cout<<hex<<*((int*)((int)arr+1));
在32位编译器中,一个int占4个字节,并且是低位在前,高位在后的方式存储的,比如1,是按照下面的方式存储的:
第1字节 第2字节 第3字节 第4字节
00000001 00000000 00000000 00000000
验证方法借用一段网上的:
#include <stdio.h>
int main(){
int i = 1;
unsigned char * p = (unsigned char *)(&i);
printf("第1字节:%d,第2字节:%d,第3字节:%d,第4字节:%d\n",*p,*(p+1),*(p+2),*(p+3));
}
那么arr[5]这个数组的前两个元素存储就可以像下面这样表示:
0000 0001 | 0x61fe84 |
0000 0000 | 0x61fe85 |
0000 0000 | 0x61fe86 |
0000 0000 | 0x61fe87 |
0000 0002 | 0x61fe88 |
0000 0000 | 0x61fe89 |
0000 0000 | 0x61fe8a |
0000 0000 | 0x61fe8b |
*((int*)((int)arr+1))中arr+1本来是表示arr+1*sizeof(int),也就是0x61fe88,但是这里先把arr转为int,在加1,结果是0x61fe85,然后再转为int*,然后对这个指针解引用,因为是int*,所以从0x61fe85这个地址开始读4个字节,
0000 0000 | 0x61fe85 |
0000 0000 | 0x61fe86 |
0000 0000 | 0x61fe87 |
0000 0002 | 0x61fe88 |
按照地位在前,高位在后,就是0000 0002 0000 0000 0000 0000 0000 0000,转为16进制输出2000000。
如果是cout<<hex<<*((int*)((int)arr+3)),同理,会输出200。
如果是*((int*)((int)arr+1)+1)呢?注意优先级,先是(int*)((int)arr+1),然后再加1,所以这里是指针加1,最后输出3000000.