这道题是我在网上看到的。拿出来给大家一起学习学习
#include <stdio.h>
int main (void)
{
int a[]={1,2,3,4,5};
int *p=(int *)(&a+1);
printf("*(p-1)=%d,*(p+1)=%d,*p=%d\n",*(p-1),*(p+1),*p);
printf("%d %d",sizeof(a),sizeof(&a));
return 0;
}
题目看似简单,其实重点难点在于理解 &a+1 的含义。
解释:&a+1 要与 a+1 区分开来。&a+1 是加了一整个a数组,偏移了整个数组的大小,在本题中也就是5个int的大小。通俗地说就是p指向的是a[5],在a数组种明显是越界了。p-1指向a[4],可以正常输出a[4]。如果将程序中的&a+1换成a+1,则p指向的是a[1],这个时候p-1,p,p+1都可以正常输出。