以下执行代码将输出显示为“6”。
#include<stdio.h>
int main()
{
int a[]={7,5,3,4,1,6};
int *ptr=(int*)(&a+1);
printf("%d",*(ptr-1));
return (0);
}
我无法理解行部分“(int *)(&amp; a + 1)”是什么意思。
答案 0 :(得分:1)
a
是6
int
的数组。因此&a
类型为&#34;指向6
int
&#34;数组的指针或(在C ++语法中)int (*)[6]
。
&a + 1
是6
int
的一个(不存在的)数组的地址,该数组位于a
末尾的内存中。
(int *)(&a + 1)
会转换&a + 1
的值,因此它的类型为int *
。这会在紧接int
结尾的内存中提供单个a
的地址。正式&a + 1
和(int *)(&a + 1)
具有相同的VALUE,但类型不同。
ptr - 1
会提供a
的最后一个元素的地址,因此打印*(ptr - 1)
会给出值6
(这是{的最后一个元素的值{1}})。
答案 1 :(得分:0)
如果你把它画出来可能更容易理解:
+---+---+---+---+---+---+---- | 7 | 5 | 3 | 4 | 1 | 6 | ... +---+---+---+---+---+---+---- ^ ^ ^ | | | &a | &a + 1 | | | ptr | ptr - 1
也就是说,从&a + 1
获得的指针指向超出数组的末尾。
另一件值得注意的事情是,对于任何指针(或数组)ptr
和索引i
,表达式*(ptr + i)
等于ptr[i]
。因此,当您执行(*ptr - 1)
时,您实际上正在ptr[-1]
恰好是6
,ptr[0]
之前的元素。