int main() { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int*)(&a + 1); printf("%d, %d", *(a + 1), *(ptr - 1)); return 0; }
a 指的是数组首元素的首地址即a[0]的首地址; 而 &a 指的是数组的首地址
则例子中的(&a + 1)就是取数组 a 的首地址,该地址的值再加上 sizzeof(a) 的值, 即就是 &a + sizeof(int) * 5,也就是下一个数组的首地址,显然这里已经超过了数组的界限。
(a + 1)是指数组的首元素 a[0] 的 下一个元素的首地址即 a[1]的首地址。因此 *(a + 1) 的输出结果是2.
因为 ptr 指向的是 a[5], 并且 ptr 是 int * 类型的,所以 (ptr - 1)指向的就是 a[4], 因此*(ptr - 1) 的输出就为5.