& 在 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 个字节。
做指针运算时记住指针的类型很重要
我遇到了一个我无法输出的代码 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 个字节。
做指针运算时记住指针的类型很重要