我说的是一个由指向指针的指针表示的零索引整数矩阵,即
int **mat;
那么 mat[m][n] 元素的正确表示方式是什么?是吗
*(*(mat+m)+n)
或者是
*(*(mat+n)+m)
另外,从视觉上看,m和n之间,哪个是行索引,哪个是列索引?或者像行和列这样的术语在这里有意义吗?我确信我在这里有一些概念上的差距,一些帮助会很好。
最佳答案
表达式
mat[m][n]
被解析为
(mat[m])[n]
相当于
(*(mat + m))[n]
又等同于
*(*(mat + m) + n)
所以你最初的猜测是正确的。
至于哪些表示行,哪些表示列 - 在某种意义上,这由您决定。您是创建数组的人,您可以为其分配您想要的任何语义。
另一方面,如果您像这样创建一个二维数组:
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],等等)而不是以相反的顺序迭代(执行mat[0][0],然后是 mat[1][0],然后是 mat[2][0],等等)。从这个意义上讲,通常将二维数组视为让第一个组件选择一行,第二个组件选择一列,因为这更自然地与内存的布局方式保持一致。
关于二维数组的正确下标排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40759973/