gpt4 book ai didi

c - 当 p 声明为 int (*)[size] 并分配给数组时,*p 是什么

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

代码:

int arr[5] = {1,2,3,4,5};
int (*p)[5] = &arr;
printf("p:%p\n",p);
printf("*p:%p\n",*p);

result: p = *p = arr = 0x7ffee517c830 都是数组的地址 enter image description here

使用p访问arr[i]的正确方法是*(*p+i)

指针p的类型是int(*)[5],所以p指向一个数组,类型是int [5]。但是我们不能说p指向了arr的一个不可见的shell,p毕竟是一个变量。存放arr的地址,也就是arr[0]的地址,arr的第一个元素。

我以为 *p 会得到 1,这是 arr 的第一个元素。

解引用操作就是把p中的值作为地址,从这个地址中取值。正确的?所以p存放的是arr的地址,这里是0x7ffee517c8301存放在这个地址。 **p 不是非法的吗?第一次解引用给我们 1,第二次解引用将使用 1 作为地址,这是非法的。

我错过了什么?

最佳答案

*p的结果是数组类型的左值表达式。在您现在能想到的任何表达式中使用 (*p) 与使用 arr 完全相同

例如:

  • &*p 表示&arr
  • **p 表示 *arr(这是合法的)。
  • (*p)[i] 表示arr[i]
  • sizeof *p 表示 sizeof arr

数组在这方面并不特殊。您可以在 int x; 中看到相同的现象; int *q = &x;。现在 *qx 具有完全相同的含义。


关于你的最后一段,我认为你把指针想象成美化的整数,这让你自己感到困惑。有些人以这种方式教授指针,但在我看来,这不是一种好的教学技巧,因为它会导致你现在所遇到的困惑。

如果您取消引用 int(*)[5],您将得到一个 int[5],仅此而已。数据类型在取消引用中很重要。谈论“取消引用 0x7ffee517c830”是没有意义的。同样,这不是数组所特有的;如果你取消引用 char ***,你会得到一个 char **

在此讨论中数组“不同”的唯一方式是如果您尝试对它们进行算术运算或输出它们等会发生什么。如果您提供 int[5] 作为例如,一个 printf 参数,隐式转换为 int * 指向这 5 个整数中的第一个。当将 * 运算符应用于 int[5] 时也会发生这种转换,这就是为什么你会从中得到一个 int

关于c - 当 p 声明为 int (*)[size] 并分配给数组时,*p 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47404656/

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