int类型数据在内存中的存储问题

刚才看到这个问题, 这里记录一下。

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.

 
 

猜你喜欢

转载自blog.csdn.net/weixin_38345919/article/details/82503217
今日推荐