#include<stdio.h>
int main()
{
int a[5] = {1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf("%p\n%p\n%p\n", a, (&a),(&a+1));
printf("%d\n%d\n", *(a+1), *(ptr-1));
}
其中*(a+1)输出为a[1] 为 2
而 *(ptr-1)输出为a[4]为 5
输出a, &a,&a+1的地址后发现,a和&a的地址是一样的,但是他们的意思是不一样的:
a : 数组的首地址,也就是a[0]的地址,所以a+1是指向数组下一个元素的地址,即是a[1]
&a:是对象(数组)的首地址,&a表示的是一个数组指针,类型为int (*)[5],&a+1是下一个对象(a是长度为5的int型数组的指针)的地址,所以是加 5*seizeof(int)。于是题目中的ptr实际是a[5]
而ptr的类型是int *, 所以最后-1只是减去sizeof(int) 得到的结果也就是a[4]啦
如下图:sizeof(int) = 4字节;//编译环境为32位