#include <stdio.h>
int main(void)
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int*)(&a + 1); // what happens here ?
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
我预计答案是 1 但得到 5 .. 为什么?
int *ptr = (int*)(&a + 1); // what happen here ?
获取数组的地址,然后将 1 添加到其中,这会产生一个指针,该指针sizeof a指向a. 然后将该指针强制转换为int*,并将其分配给ptr。同样可以实现
int *ptr = &a[5];
在这种情况下。
然后ptr - 1是一个指针,指向sizeof(int)之前的字节ptr,即指向&a[4],并且*(ptr - 1)是a[4]。
指针运算以“指针大小”为单位进行。由于&a是指向 5 int- an 数组的指针int (*)[5],因此向它添加 1 会移动它的5*sizeof(int)字节。
&a是指向指针的指针int[5],因此&a + 1又是指向 的指针int[5]。松开&并且一切都应该没问题(而且你将不再需要演员表):
int *ptr = a + 1;
int *ptr = (int*)(&a + 1); // what happen here ?
a= 数组第一个元素的地址:a[0](int 的地址)
&a = 数组 a 的地址,与 "a" 的值相同,但类型是数组的地址,因此表达式 "(&a + 1)" 是指向下一个数组 "a" 的指针。(ptr - 1):指向ptr的前一个int的指针,即数组“a”的最后一个元素的指针。
数组名称保存数组的基地址。因此,*(a+1) 给出索引位置 1 处的元素,即 2。表达式 (&a + 1) 保存数组末尾之后的地址,并将其存储在指针变量“ptr”中。因此,*(ptr-1) 给出了存储在最后一个索引位置 5 的元素。