#include <stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p = (int *)(&a+1);
// printf("%p\t%p\n",a,p);
printf("%d\t%d",*(a+1),*(p-1));
return 0;
}
/*
输出:
//0x7ffd9226ad50 0x7ffd9226ad64
2 5
*/
这题初看可能会直接得出答案是2 1,但真正答案是2 5,原因是(&a+1)这一句,a是一个数组名,也代表该数组的首地址,&a表示地址的地址,也就是二维指针了。这个二维指针是指向包含 5个成员的int型数组,相当于一个数组指针int (*p)[5],所以(&a+1)就指向了下个包含5个成员的int型数组首地址,之后又在外面做了类型转换(int *)转为一维指针,所以p-1就指向了上个数组的末地址,也就是a+4,最终答案*(p-1)就是5。