C中的多维数组:它们是锯齿状的吗?

Pro*_*mer 19 c arrays jagged-arrays multidimensional-array ansi-c

关于C编程语言(ANSI-C)的一个简单问题:

C中的多维数组是锯齿状的吗?

我的意思是 - 我们在谈论"数组数组"(一个指向内存中其他地址的指针数组),或者这只是"长一维数组"(它是按顺序存储在内存中)?

困扰我的是我有点确定:

matrix[i][j] 相当于 * ( * (matrix + i) + j)

use*_*ica 13

C中的多维数组是连续的.下列:

int m[4][5];
Run Code Online (Sandbox Code Playgroud)

int[5]记忆中彼此相邻的4 秒组成.

指针数组:

int *m[4];
Run Code Online (Sandbox Code Playgroud)

是锯齿状的.每个指针都可以指向不同长度的单独数组(的第一个元素).

m[i][j]相当于*(*(m+i)+j).参见C11标准,第6.5.2.1节:

下标运算符[]的定义是E1 [E2]与(*((E1)+(E2))相同)

因此,m[i][j]相当于(*(m+i))[j],相当于*(*(m+i)+j).

存在这种等价是因为在大多数情况下,数组类型的表达式衰减到指向其第一个元素的指针(C11标准,6.3.2.1).m[i][j]解释如下:

  • m是一个数组数组,因此它衰减到m[0]第一个子数组的指针.
  • m+i是指向ith子阵列的指针m.
  • m[i]相当于*(m+i),取消引用指向该i子数组的指针m.由于这是数组类型的表达式,因此它会衰减为指针m[i][0].
  • m[i][j]相当于*(*(m+i)+j),取消引用指向ji子数组的第th 个元素的指针m.

请注意,指向数组的指针与指向其第一个元素的指针不同.m+i是一个指向数组的指针; 它不是数组类型的表达式,它不会衰减,无论是指向指针还是指向任何其他类型.


Kla*_*äck 1

如果声明一个多维数组,您将得到“长一维数组”(在内存中顺序存储)。

如果你声明一个指向指针的指针(指向指针......),你会得到数组的数组。

对于 C 初学者来说,这种差异是很多困惑的根源。