{[44]在多维数组中表示什么(平均值)?

时间:2019-04-06 14:34:03

标签: c arrays multidimensional-array

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

我正在研究的部分涉及“处理多维数组的行”,并且其中有一个示例

p = &a[i][0] ; 

可以写为

p = a[i]; 

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

然后是关于“使用多维数组的名称作为指针”的部分,其中在整数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行第一个元素的指针。(或者是同一回事吗?也许因为我对这个概念有些陌生而感到困惑)

P.S。这本书是C编程(KNK)的12.4章。

2 个答案:

答案 0 :(得分: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]的存储位置相同,区别在于表达式的 type 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

答案 1 :(得分:0)

让我们解决这个问题:数组和指针并不相同。数组类型是另一种类型。例如,如果您有一个指针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]指的是答案之一,尽管它通常会衰减为指针。