我遇到了一个我无法理解的代码输出。代码是 -
int main()
{
int a[] = {1, 2, 3, 4, 5, 6};
int *ptr = (int*)(&a+1);
printf("%d ", *(ptr-1) );
return 0;
}
上面代码的输出结果是6,但我认为它应该是1.请解释为什么它是6。
答案 0 :(得分:3)
在你的问题中,“& a”是整个数组a []的地址。如果我们将1加到& a,我们得到“[] + sizeof(a)的基址”。并且这个值被类型化为int *。所以ptr指向6后的内存。 ptr被类型化为“int *”并且打印了*(ptr-1)的值。由于ptr指向6后的内存,所以ptr - 1指向6。
答案 1 :(得分:2)
&a
是数组a
的地址。向其添加1
会将其增加到数组之后的一个(添加24个字节)。将运算符(int*)
强制转换&a+1
指向int
类型的指针。 ptr-1
仅将ptr
递减4
个字节,因此它是数组a
的最后一个元素的地址。解除引用ptr - 1
将提供6
的最后一个元素。
答案 2 :(得分:0)
是的,因为a
是一个类型为int[6]
的数组。因此,&a
会为您提供int (*)[6]
类型。与指向int的指针不是相同,它是指向int
数组的指针。
因此,&a + 1
将指针递增一个数组大小,指向数组的最后一个元素。
然后,取ptr
中的地址并执行-1
,将地址减少sizeof(*ptr)
sizeof(int)
,这将为您提供最后一个元素的地址数组。
最后,取消引用该地址,您将获得最后一个元素6
的值。成功。
答案 3 :(得分:0)
因为(int*)(&a + 1)
使用整个数组作为基类型,并将一个整数的数组添加到地址中,即添加24个字节。
当你执行ptr-1
ptr
类型为int时,它将减去4个字节。
在进行指针运算时记住指针的类型非常重要。