源代码如下:
#include <stdio.h>
int main()
{
int a[5] ={1,2,3,4,5};
int *ptr1 = (int*)(&a+1);
int *ptr2 = (int*)((int)a+1);
printf("%x ,%x\n",ptr1[-1],*ptr2);
return 0;
}
结果输出:
思考?为什么呢?
主要涉及的问题:
- 内存对齐
- 大小端
- int类型的大小
- %x:十六进制输出
解析:
int *ptr1 = (int*)(&a+1);
可以这样理解:&a+1相当于a+5,相当于跨过了整个数值,然后ptr1[-1],输出其前一个,就是结果5了。int *ptr2 = (int*)((int)a+1);
这个可以这样理解:这个里面(int)a+1
,a是指的一个地址00h,当然地址也是由数据表示的,(int)a就是吧这个地址数据强行转换城一个整形数据,所以(int)a + 1
就是一个整形数据加1,也就是0x01,然后(int *)
是将这个数据强行转换成一个int地址,所以*ptr2
表示的是一个01h地址中存放的int数据,所以输出的将其按16进制输出就是 02000000。
涉及大小端的问题,请参考:大小端存储