二维数组的正确下标排序

标签 c arrays pointers multidimensional-array

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

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/

相关文章:

c++ - 将 TideSDK 与 C *.dll 集成

c - char*str= {"foo",...} 和 char str[][5]= {"foo",...} 数组定义有什么区别?

ios - 在结构或其他方法中全局存储数组

php - 使用特定列中的值替换第一级数组键

c++ - SDL 指针和引用

无法在 OpenCV 中将 Gray 转换为 BGR

c++ - 通过引用传递参数到底是什么?

arrays - VBA - Countif Range 与数组中的至少一个值匹配

c# - C++ 到 C# 的包装 - 如何处理 C# 中的双指针数组

c++ - 为什么计算不对?