【问题标题】:what does a[0] indicate(mean) in multidimensional array?a[0] 在多维数组中表示(均值)什么?
【发布时间】:2019-04-07 05:42:02
【问题描述】:

我刚刚开始通过一本书学习 C 语言,并且在他们讨论指针和数组的部分并没有感到困惑。如果有一个名为a[NUM_ROW][NUM_COLS] 的多维数组(我将只讨论这个数组作为具体的二维数组),a[0] 是什么意思?

我正在学习的部分有一个关于“处理多维数组的行”的部分,它有一个例子

p = &a[i][0] ; 

可以写成

p = a[i]; 

书上说a[i]是指向第i行第一个元素的指针。

然后有一部分是关于“使用多维数组的名称作为指针”,在 int a[NUM_ROWS][NUM_COLS] 的情况下,数组名称 a 不是指向 a[0][0] 的指针,而是指向 a[0] 的指针.

a[0] 和第一部分的a[i] 意思一样吗?我有点困惑,因为在关于“使用多维数组的名称作为指针”的部分书中说数组名 a 是指向长度为 NUM_COLS 的整数数组的指针(并且 a 的类型为 int (*) [NUM_COLS]

我想知道a[0] 是表示长度为 NUM_COLS 的整数数组还是指向第 0 行中第一个元素的指针。(或者是同一件事?也许是因为我对这个概念有点陌生并且感到困惑。)

附:这本书是C编程(KNK)的第12.4章

【问题讨论】:

  • 给定a[n][m],您可以说a[0]m 元素的数组(在许多情况下,a[0] 被转换为指向数组a[0] 的第一个元素的指针)。
  • 你可能会喜欢c-faq的第6部分。
  • 哦,谢谢,我去看看!

标签: c arrays multidimensional-array


【解决方案1】:

通常,数组的名称衰减为指向其第一个元素的指针。多维数组基本上只是一个数组数组,所以当你有int a[NUM_ROW][NUM_COL] 时,a[i] 是第 i 行的“名称”。

因此,根据上述规则,a[i] 衰减为指向该行第一个元素的指针,即a[i][0]。为了创建一个指针,我们将 & 放在表达式之前,即 &a[i][0]

a 衰减为指向二维数组第一个元素的指针。主数组的每个元素都是一行,而不是单个整数,所以a 等价于&a[0],而不是&a[0][0]

a[0]a[0][0]的内存位置相同,区别在于表达式的类型a[0][0] 的类型是int,但a[0] 的类型是int[NUM_COL],在很多情况下会衰减为int *。使用typeof 运算符最容易看到这一点:

printf("size of a = %d, size of a[0] = %d, size of a[0][0] = %d\n", sizeof a, sizeof a[0], sizeof a[0][0]);

如果NUM_ROW = 5NUM_COL = 10,这可能会打印:

size of a = 200, size of a[0] = 40, size of a[0][0] = 4

【讨论】:

  • 感谢您的回答!所以在第 3 段中你说“所以 a 相当于 &a[0]”,a[0] 是第 i 行的名称(或二维数组的第一个元素)而不是指针?
  • 是的。当数组是 & 运算符的参数时,数组不会衰减为指针。
【解决方案2】:

让我们解决这个问题:数组和指针不是一回事。数组类型是不同的类型。例如,如果你有一个指针int* ptr++ptr 是完全有效的(尽管它可能没有指向有效的东西),但是如果你有一个像int a[3] 这样的数组,你可能不会增加它。但是数组的一个约束是,您可能不会将数组传递给函数,并且函数可能不会返回数组类型。但是当你尝试时会发生什么?发生的情况是您的数组被隐式转换为指向其第一个元素的指针。这就是混乱的来源:当您需要指向它们的指针时,数组将转换为指向其第一个元素的指针。因此,ptr = a 意味着ptr 现在指向a 的第一个元素。

现在假设我们有这个:

int arr[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};

这究竟是什么?它是一个数组数组。 arr[i] 指的是答案之一,尽管它通常会衰减为指针。

【讨论】:

  • 感谢您的回答。是的,我认为我对指针和数组的混淆可能是这个问题的主要原因..
猜你喜欢
  • 2019-01-24
  • 2015-08-16
  • 1970-01-01
  • 2021-12-05
  • 2014-01-05
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多