【问题标题】:Correct Subscript Ordering for Two Dimensional Arrays二维数组的正确下标排序
【发布时间】:2023-03-09 18:50:01
【问题描述】:
我说的是一个零索引的整数矩阵,由指向指针的指针表示,即
int **mat;
那么表示 mat[m][n] 元素的正确方法是什么?是吗
*(*(mat+m)+n)
还是
*(*(mat+n)+m)
另外,从视觉上讲,在 m 和 n 之间,哪一个是行索引或哪一个是列索引?或者像行和列这样的术语在这里有意义吗?我确信我在这里有一些概念上的差距,一些帮助会很大。
【问题讨论】:
标签:
c
arrays
pointers
multidimensional-array
【解决方案1】:
表达式
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],等等)。从这个意义上说,通常将 2D 数组视为让第一个组件选择一行,第二个组件选择一列,因为这更自然地与内存的布局方式保持一致。