6
#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 .. 为什么?

4

4 回答 4

12
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)字节。

于 2013-02-28T17:09:05.473 回答
5

&a是指向指针的指针int[5],因此&a + 1又是指向 的指针int[5]。松开&并且一切都应该没问题(而且你将不再需要演员表):

int *ptr = a + 1;
于 2013-02-28T17:08:44.333 回答
1
int *ptr = (int*)(&a + 1);  // what happen here ?

a= 数组第一个元素的地址:a[0](int 的地址)

&a = 数组 a 的地址,与 "a" 的值相同,但类型是数组的地址,因此表达式 "(&a + 1)" 是指向下一个数组 "a" 的指针。(ptr - 1):指向ptr的前一个int的指针,即数组“a”的最后一个元素的指针。

于 2013-03-01T02:25:29.070 回答
0

数组名称保存数组的基地址。因此,*(a+1) 给出索引位置 1 处的元素,即 2。表达式 (&a + 1) 保存数组末尾之后的地址,并将其存储在指针变量“ptr”中。因此,*(ptr-1) 给出了存储在最后一个索引位置 5 的元素。

于 2020-12-08T06:42:32.653 回答