& 在 c 中的代码行为的输出

Output of a code- behaviour of & in c

我遇到了一个我无法输出的代码 understand.The 代码是-

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

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

上面代码的输出结果是6,我觉得应该是1,请解释为什么是6。

是的,因为 a 是一个类型为 int[6] 的数组。因此,&a 给出类型 int (*)[6]。它与指向 int 的指针不同,它是指向 int 数组的指针。

因此,&a + 1 将指针递增 数组大小之一 ,指向数组的最后一个元素。

然后,获取 ptr 中的地址并执行 -1,将地址减去 sizeof(*ptr)sizeof(int),从而得到最后一个地址数组上的元素。

最后,取消对该地址的引用,您将获得最后一个元素的值 6。成功。

&a是数组a的一个地址。向其添加 1 会将其递增到数组后的一位(添加 24 个字节)。转换运算符 (int*)&a+1 转换为指向 int 类型的指针。 ptr-1 只会将 ptr 递减 4 个字节,因此它是数组 a 的最后一个元素的地址。取消引用 ptr - 1 将给出最后一个元素 6.

在你的问题中“&a”是整个数组a[]的地址。如果我们将 &a 加 1,我们得到“a[] + sizeof(a) 的基地址”。并且这个值被类型转换为 int *。所以 ptr 指向 6 之后的内存。 ptr 被类型转换为 "int *" 并打印 *(ptr-1) 的值。由于ptr指向6之后的内存,所以ptr – 1指向6.

因为(int*)(&a + 1)使用整个数组作为基本类型并将数组的1个整数大小添加到地址,即添加24个字节。

并且当您执行 ptr-1 时,因为 ptr 类型是 int 它将仅减去 4 个字节。 做指针运算时记住指针的类型很重要