int * ptr =(int *)(& a + 1);

时间:2013-02-28 17:05:55

标签: c pointers

#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 个答案:

答案 0 :(得分:11)

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]。< / p>

指针算法以“指针大小”为单位进行。由于&a是指向5 int - int (*)[5]数组的指针,因此向其添加1将其移动5*sizeof(int)个字节。

答案 1 :(得分:5)

&a是指向int[5]指针的指针,因此&a + 1再次成为指向int[5]的指针。松开&并且一切都很好(并且你也不再需要演员):

int *ptr = a + 1;

答案 2 :(得分:1)

int *ptr = (int*)(&a + 1);  // what happen here ?

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

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

答案 3 :(得分:0)

阵列名称保存阵列的基地址。因此,*(a + 1)给出索引位置1处的元素为2。表达式(&a + 1)保存数组末尾的地址,并且该地址存储在指针变量'ptr'中。因此,*(ptr-1)给出存储在最后一个索引位置为5的元素。