二维数组按行存储和按列存储计算方法
二维数组的基本结构
一个二维数组通常是逻辑上的一个矩阵。例如,a[m][n]
表示一个二维数组,包含 m
行和 n
列:
a[0][0], a[0][1], ..., a[0][n-1]
a[1][0], a[1][1], ..., a[1][n-1]
...
a[m-1][0], a[m-1][1], ..., a[m-1][n-1]
内存中的存储方式:
- 按行存储(Row-Major Order):一行中的所有元素按顺序存放在内存中,接着存放下一行。例如,
a[0][0], a[0][1], ..., a[0][n-1], a[1][0], a[1][1], ...
。 - 按列存储(Column-Major Order):一列中的所有元素按顺序存放在内存中,接着存放下一列。例如,
a[0][0], a[1][0], ..., a[m-1][0], a[0][1], a[1][1], ...
。
按行存储
在按行存储中,元素是按行的顺序线性排列的。对于 a[i][j]
,其地址计算公式为:
公式:
地址
=
基地址
+
(
i
⋅
n
+
j
)
⋅
元素大小
\text{地址} = \text{基地址} + (i \cdot n + j) \cdot \text{元素大小}
地址=基地址+(i⋅n+j)⋅元素大小
解释:
i
表示行号。j
表示列号。n
是列数(即每行的元素个数)。元素大小
是每个元素占用的字节数(例如int
通常占 4 字节)。
示例:
假设有一个二维数组 a[3][4]
,按行存储,基地址为 1000,元素为 int
类型(每个占 4 字节)。访问 a[2][3]
的地址:
- 行号
i = 2
,列号j = 3
,列数n = 4
。 - 偏移量计算: (2 × 4 + 3) × 4 = 44 字节。
- 地址为:1000 + 44 = 1044 。
按列存储
在按列存储中,元素是按列的顺序线性排列的。对于 a[i][j]
,其地址计算公式为:
公式:
地址
=
基地址
+
(
j
⋅
m
+
i
)
⋅
元素大小
\text{地址} = \text{基地址} + (j \cdot m + i) \cdot \text{元素大小}
地址=基地址+(j⋅m+i)⋅元素大小
解释:
j
表示列号。i
表示行号。m
是行数(即每列的元素个数)。元素大小
是每个元素占用的字节数。
示例:
假设有一个二维数组 a[3][4]
,按列存储,基地址为 1000,元素为 int
类型(每个占 4 字节)。访问 a[2][3]
的地址:
- 列号
j = 3
,行号i = 2
,行数m = 3
。 - 偏移量计算: (3 × 3 + 2) × 4 = 44 字节。
- 地址为:1000 + 44 = 1044 。
对比总结
存储方式 | 地址计算公式 | 数据排列顺序 |
---|---|---|
按行存储 | 基地址 + ( i ⋅ n + j ) ⋅ 元素大小 \text{基地址} + (i \cdot n + j) \cdot \text{元素大小} 基地址+(i⋅n+j)⋅元素大小 | 按行连续存储:一行接一行 |
按列存储 | 基地址 + ( j ⋅ m + i ) ⋅ 元素大小 \text{基地址} + (j \cdot m + i) \cdot \text{元素大小} 基地址+(j⋅m+i)⋅元素大小 | 按列连续存储:一列接一列 |