gpt4 book ai didi

c - int *p=somearray 但 (p+1) 不等于 somearray[1] 的地址。为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:21 26 4
gpt4 key购买 nike

#include <stdio.h>

int main()
{
int a[]={11,12,13},*p;
printf("%x\n",a);

for(int i=0;i<3;i++)
printf("%x ",(a+i));

p=(&a)+1; //LINE1
printf("this is this %x\n",p); //LINE2
printf("%d ",*p);
printf("%d\n",*(p-1));
return 0;
}

LINE1指针运算后,为什么LINE2打印的地址不等于a[1]?相反,还有 4 个字节的额外差异。

最佳答案

当你写作时

&a

你正在获取数组的地址 a .由于数组的类型 aint [3] , 这个指针的类型是 int (*) [3] ,指向三个整数数组的指针。

当你接着写

&a + 1

您是在说“转到指向 a 的那个对象之后的那个对象。”请记住 a类型为 int (*) [3] ,因此 C 将其解释为指向“指向由 int 指向的三个 int 的数组之后的三个 a 的数组。”结果,您将指向 3 × sizeof(int)超出数组底部的字节,这不是您可以找到元素 a[1] 的地方.

您可能应该从该行收到编译器警告

p = (&a) + 1

因为类型不对。指针p是一个 int *右侧的表达式的类型为 int (*) [3] .使用高警告设置进行编译可能会提醒您某事 是错误的,这可能会提示您这里有些事情不太对劲。我建议以后使用高警告设置进行编译,因为如今编译器标记的许多警告都是合理的问题。

您可以采取一些措施来解决此问题。一种是写

&a[0] + 1

表达式&a[0]表示“指向 a 的第一个元素的指针”,类型为 int * ,因此当您向其添加一个时,C 会将其解释为“指向 int 之后的下一个 a[0],即 a[1] 所在的位置。

由于数组到指针的衰减,你也可以这样写

a + 1

因为 C 解释表达式 a作为指向 a 的第一个元素的指针(即 &a[0] )。

总结:

  • 指针算法取决于底层类型的大小。
  • 写作 &a给你一个指向元素数组的指针,而不是指向数组第一个元素的指针。地址相同,但类型不同。

关于c - int *p=somearray 但 (p+1) 不等于 somearray[1] 的地址。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46392761/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com