一维数组
存储地址计算
a[i] 的存储地址为:a + i * len
解释:
len是一个元素的大小i:索引
二维数组
按行存储
第二个元素的索引是:a[0][1],如下图
存储地址计算
a[1][2] 的存储地址:a+(1*4+2)*len
所以,a是 m行n列 的数组,元素a[i][j] 的存储地址公式:
a + ( 行索引 * 总列数 + 列索引 ) * 一个元素的长度
即:
a+(i*n+j)*len
解释:
行索引 * 总列数:表示前面行的所有元素数量列索引:表示当前行,前面元素的数量
按列存储
第二个元素的索引是:a[1][0],如下图
存储地址计算
a[1][2] 的存储地址:a+(2*4+1)*len
所以,a是 m行n列 的数组,元素a[i][j] 的存储地址公式:
a + ( 列索引 * 总行数 + 行索引 ) * 一个元素的长度
即:
a+(j*m+i)*len
解释:
列索引 * 总行数:表示前面列的所有元素数量行索引:表示当前列,前面元素的数量
题
已知 5行5列 的二维数组a中的各元素占 两个字节,求元素 a[2][3] 按 行 优先存储的存储地址?按 列 优先存储的存储地址?
答
行存储:
a+( 2 * 5 + 3) * 2byte = a + 26byte
列存储:
a+( 3 * 5 + 2) * 2byte = a + 34byte
题
二维数组 a[1..N,1..N] 可以按 行存储 或按 列存储。对于数组元素 a[i,j](1<=i,j<=N),当( )时,在按行和按列两种存储方式下,其偏移量相同。
A、i≠j
B、i=j
C、i>j
D、isj
分析
偏移量相同,也就是让公式 a+(i*n+j)*len 和 a+(j*m+i)*len 中的下面两部分相同:
i*n+j == j*m+i
从 二维数组 a[1..N,1..N]可知,行列总数相同,也就是:
i*m+j == j*m+i
从上面公式可知:当 i == j 时,偏移量相同
答案
B
参考:
https://blog.csdn.net/m0_63783532/article/details/127624589

