#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 的元素。