题目
求下面代码打印出的结果
#include<stdio.h>
int main()
{
int a[4] = { 1, 2, 3, 4};
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x, %x", ptr1[-1], *ptr2);
return 0;
}
分析解答
首先创建了一个整形数组a
并且对其初始化,a
中存储的内容如下:
a
在内存中的存储如下:
首先看ptr1[-1]
:
经过 int* ptr1 = (int*)(&a + 1);
的操作,我们可知首先取a
的地址并且+1
,因为a为数组
,所以+1
跳过整个数组得到4后一个字节
的内容,然后再把指针ptr1
强制类型转换为整形指针
,再经过ptr[-1]=*(ptr1 - 1)
操作后,因为ptr1
已经被强转为整形指针所以-1
指向前一个字节即为4
所以ptr1[-1]
打印出来结果即为4
再看*ptr2
:
经过int* ptr2 = (int*)((int)a + 1);
的操作,我们首先知道此时的a为一个数组的地址是一个十六进制的数
,而把地址强制类型转换为整形+1
,就相当于地址+1
,具体解释如下图:
故此*ptr2
打印出的即是2000000