二维数组的基本结构
一个二维数组通常是逻辑上的一个矩阵。例如,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 ) × 元素大小
解释:
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) × 元素大小
解释:
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 ) × 元素大小 | 按行连续存储:一行接一行 |
| 按列存储 | 基地址 + (j × m + i) × 元素大小 | 按列连续存储:一列接一列 |
评论留言
欢迎您,!您可以在这里畅言您的的观点与见解!
0 条评论