【问题标题】:Multidimensional array and pointer to pointer value多维数组和指向指针值的指针
【发布时间】:2017-12-26 15:46:48
【问题描述】:

鉴于以下情况:

int ar2[3][2];
int * pt;
int **p2;
p2 = &pt;
*p2 = ar2[0];

这就是我的书所说的:

*p2 是指向 int 的类型,使其与 ar2[0] 兼容。 回想一下,ar2[0] 是一个指针,指向它的第一个元素,art2[0][0],使 ar2[0] 类型也指向 int。

一切都是真的吗?

【问题讨论】:

  • 本书简化了事情。 ar2[0] 是ar2[3][2] 的第一个元素,它是一个二维数组;但是,C 中的二维数组是一维数组的数组,因此第一个元素是一维数组。您可以通过sizeof(ar2[0]) 检查其大小来轻松检查。现在在 C 中的赋值和参数传递数组中衰减或“调整”为指针,因此语句 *p2 = ar2[0]; 是可能的,但 ar2[0] 本身不是指针。
  • 这是我的回答,谢谢@PeterA.Schneider
  • @PeterA.Schneider 你应该把它作为一个实际的答案。

标签: c arrays pointers


【解决方案1】:

什么是指针

一个 4/8 字节大小的实体、变量或常量(type * p 或 type const * p),必须指定它们指向的实体的类型。如果是可变的,它可以改变它指向的实体。

什么是数组

一个数组总是存在于栈中,它的内存大小等于它的元素的数量乘以它们的类型的大小,并且像 const 指针一样,它不能停止指向它的定义元素。多维数组可以看作是一棵数组树:在其第 0 维中指定一个位置将返回另一个少一维的位置。

回答

实际上,数组可以用作专门的堆栈常量指针,指向层次结构中下一级的第一个元素:

  1. type {*} 为type {*} arr[]
  2. type {*} arr[] 为type {*} arr2[][]
  3. type {*} arr2[][] 为type {*} arr3[][][]
  4. Element 0 of 0th dimension 为 Any array

这就是为什么int (* arp)[2] = ar2 中的arp 是指向数组ar2[0] 的指针(即ar2 的第一个分支)。

它们不是指针,但我相信这种思维方式可以改进语言内部的模型。

【讨论】:

  • 这是不正确的。如问题 cmets 中所述,arr2[0] 是 2 个ints 的数组,而不是指向int的指针。它会衰减到一个指针,这就是赋值起作用的原因,但它本身就是一个数组。
  • 我刚刚改进了我对数组的解释。我认为这清楚地表明我不认为 arr2[0] 是一个指针。
猜你喜欢
  • 1970-01-01
  • 2013-04-29
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多