二维数组 A[m][n] 按行优先和按列优先的 下标地址转换公式

设二维数组 A[m][n] 按行优先存储, 每个元素占 p 个字节,


  则 Loc(i, j) 的地址为 (i * n + m) * p, 第 i 行前面有 i 行, 每行有 n 个元素, 加上 第 i 行的的 j 个元素,所以地址 为 (i * n + m) * p,


  1. 若 j 从下标 1 开始, 则 Loc(i, j) = (i * n + j - 1)


     第 i 行的 第 j 个元素,在第 i 行中 前面只有 j  - 1 个元素,


  2. 若 i 从下标 1开始, 则 Loc(i, j) = ((i - 1) * n + j)


  3. 若 i, j 均从 下标 1 开始, 则 Loc(i, j) = ((i - 1) * n + j - 1)


若该数组按列优先存储,


  则 Loc(i, j) 为  (j * m + i) * p, 第 j  列前面有 j 列,每列有 m 个元素, 加上 第 j 列的 i 个元素,所以为 (j * m + i) * p


  1. 若 j 从下标 1 开始, 则 Loc(i, j) = ((j - 1) * m + i);


    因为 第 j 列前面只有  (j - 1) 列


  2. 若 i 从下标 1开始, 则 Loc(i, j) = (j * m + i - 1)


    第 i 个元素前面实际上只有 i - 1 个元素


  3. 若 i, j 均从 下标 1 开始, 则 Loc(i, j) = ((j - 1) * n + i - 1)


 


总结:


  按行优先 Loc(i, j) = (i * n + j) * p, 按列优先 Loc(i, j) = (j * m + i) * p, 行从下标1 开始  i 就减一, 列从下标 1 开始 , j 就减一