&的代码行为的输出在c

时间:2015-06-23 21:23:19

标签: c arrays pointers pointer-arithmetic

我遇到了一个我无法理解的代码输出。代码是 -

int main() 
{       
  int a[] = {1, 2, 3, 4, 5, 6};   

  int *ptr = (int*)(&a+1); 
  printf("%d ", *(ptr-1) ); 
  return 0; 
} 

上面代码的输出结果是6,但我认为它应该是1.请解释为什么它是6。

4 个答案:

答案 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个字节。 在进行指针运算时记住指针的类型非常重要。