二维数组的正确下标排序

时间:2016-11-23 09:02:58

标签: c arrays pointers multidimensional-array

我说的是由指针指针表示的零索引整数矩阵,即

int **mat;

那么表示mat [m] [n]元素的正确方法是什么?是吗

*(*(mat+m)+n)

或者是

*(*(mat+n)+m)

另外,从视觉上讲,在m和n之间,哪一个是行索引,哪一个是列索引?或者像行和列这样的术语在这里有意义吗?我相信我在这里有一些概念上的差距,一些帮助会很棒。

1 个答案:

答案 0 :(得分:1)

表达式

mat[m][n]

被解析为

(mat[m])[n]

相当于

(*(mat + m))[n]

又相当于

*(*(mat + m) + n)

所以你的初步猜测是正确的。

至于哪些平均行以及哪些平均列 - 在某种意义上,这取决于您自己决定。您是创建数组的人,您可以为其指定任何您喜欢的语义。

另一方面,如果您创建这样的2D数组:

int mat[A][B];

然后在记忆中,这将被列为

[0, 0][0, 1][0, 2]...[0, B-1][1, 0][1, 1][1, 2]... ... [A-1][B-1]

由于引用的位置,如果你按照上面显示的顺序阅读(完成所有mat [0],那么所有的mat [1]等),而不是按相反的顺序迭代(do mat [0] [0],然后mat [1] [0],然后mat [2] [0]等。从这个意义上说,将2D数组视为让第一个组件选择一行而第二个选择一个列是很常见的,因为这更自然地与内存的布局方式一致。