#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
。