#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 .. 为什么?
答案 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的元素。