【问题标题】:C two dimensional arrays: Is the first 'level' an array of pointers?C二维数组:第一个“级别”是指针数组吗?
【发布时间】:2015-02-16 11:26:06
【问题描述】:

在 C 中,我们有二维数组,即a[m][n]

在一维数组中,a 是指向数组开头的指针。

二维数组呢? a[i] 是否持有指向数组中i 行开头的指针?因此a[i] 是一个指针数组,它在以下问题function(int **a, m, n) 中传递给函数?

【问题讨论】:

  • "在一维数组中,a 是指向数组开头的指针。"不,不是。
  • a[m][n] 是一个数组数组。
  • @MichałSzydłowski:不,a 在 OP 提到的所有情况下都是一个数组。 "数组不是指针!"
  • @Dean:如果使用没有索引的数组,它衰减指向其第一个元素的指针。

标签: c pointers multidimensional-array


【解决方案1】:

a[i] 是否持有指向数组中第 i 行开头的指针?

没有。 C 中二维数组的数据是一个连续的元素块加上一些巧妙的索引访问。但是二维数组是数组的数组,而不是指针的数组。

形式上,a[i] 包含一个一维数组。在某些情况下,这可能会衰减为指向第 i 行第一个元素的指针,但它的类型仍然是 T[n],对于您未指定的某些类型 T

【讨论】:

  • 一维指针数组,每个指针指向“二级”数组的第一个元素。
  • @Dean 是的,怎么样?你到底想说什么?山上的一条黑狗。
  • 我想直接得到每个数组包含的内容,现在从答案中非常清楚,谢谢。
  • @Dean 每个数组包含i给定类型的项目数,不多也不少。任何地方都没有指针。 (当然,除非你声明了一个“pointers-to-type”数组。)
  • 不幸的是,在 C 课程中,他们将多维数组呈现为指针数组,这些指针指向数组的第一个元素,因此造成了混乱。
【解决方案2】:

在一维数组中,a 是指向数组开头的指针。

不正确。 a 是一个数组。当您在表达式中使用a 时,它“衰减”为指向第一个元素的指针。为了更好地理解这一点,read this chapter of the C FAQ,尤其是this one

二维数组呢? a[i] 是否保存指向数组中第 i 行开头的指针?

没有。在二维数组中,a[i] 是一个数组,而int a[x][y]; 是一个数组数组。任何地方都没有指针。

您可能会感到困惑,因为 C 允许使用以下语法:int a[][N] = ...;,但该语法仅仅意味着数组数组的大小取决于初始化列表中的项目数。

【讨论】:

  • “在表达式中使用 a 时”。当然,这取决于表达方式。例如,如果表达式是指向数组指针的赋值的 RHS,则它不会衰减。
  • @juanchopanza 好吧,是的,但鉴于 OP 是初学者,将所有细节都拖到这个答案中似乎没有多大帮助。
  • 不应该 a[x][y] 是一个元素,而不是一个数组数组?
  • @rcgldr 啊,是的,好点。这取决于上下文。 int a[x][y]; 是一个数组数组,而a[x][y] = 0; 确实指的是数组中的一项。编辑了我的答案以进行澄清
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多