#include <stdio.h>
void main()
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a+1);
printf("%d, %d", *(a+1), *(ptr-1));
return;
}
这个题很有迷惑性,必须对数组和指针的含义非常了解才可以给出答案。
*(a+1)就是a[1],但是*(ptr-1)不是a[0]。因为&a+1 并不是数组a的首地址加1,而是数组a的地址加以一个数组a的偏移,即偏移了一个数组的大小(5个int的地址)。
所以说int *ptr = (int *)(&a+1)的结果是ptr指向了数组的第六个元素a[5]。
出现这种情况的原因就是&a和a的含义是不同的:数组名a可以看成是数组的首地址,a+1是数组的首地址加1,是数组的第二个元素a[1]。而&a是数组a的指针,其类型是int(*)[5],而指针加1是要根据指针类型而加上一定的值的,不同类型的指针加1后的结果是不相同的。