【问题标题】: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 数组视为让第一个组件选择一行,第二个组件选择一列,因为这更自然地与内存的布局方式保持一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多