#include <stdio.h>
int main(void)
{
int a[5]= {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1); // 先取地址再加1
//printf("%p, %p\n", &a+1, ptr); //将地址输出
printf("%d, %d\n", *(a + 1), *(ptr - 1));
return 0;
}
执行结果是 2 5
解释:
对于int *ptr = (int *)(&a + 1); 系统不认为&a+1是数组首地址+1。对数组名求址(&a),会导致数组维数升级,编程了数组指针,其类型为int(*)[5]。而这样的指针加1,则要根据指针类型加上一个a数组的偏移,是偏移了整个数组的大小(本例是5个int),所以要加5*sizeof(int)。于是ptr实际上是&(a[5]),也就是a+5了,ptr实际指向a[5]。
但, ptr与(&a + 1)类型时不相同的,ptr-1只会减去一个整数位置,即sizeof(int *)。