int main() { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int*)(&a + 1); printf("%d, %d", *(a + 1), *(ptr - 1)); return 0; }
代码中定义了一个长度为 5 的整型数组 a,并且给它赋值 1 到 5 的连续整数。接着定义了一个指向整型的指针 ptr,将 a 的地址加上 1,也就是跳过了整型数组 a 的长度,指向了 a 数组之后的内存地址。需要注意的是,由于 &a 是整个数组 a 的地址,所以加上 1 不是访问 a 数组最后一个元素的地址,而是跨越了整个 a 数组,指向了一个未知的地址。因此,ptr 指针只能保证指向了一个合法的内存地址,但不能保证这个地址包含有意义的值或数据。
接着使用 printf 函数分别输出了 a 数组中下标为 1 的元素和 ptr 指针指向的值。a + 1 指向了数组 a 的第二个元素,即整数 2,因此 *(a + 1) 的值为 2。而 ptr - 1 的地址正好指向了数组 a 的最后一个元素,即整数 5,因此 *(ptr - 1) 的值为 5。因此,代码的输出结果为 2, 5。