Appearance
408
数据结构
DS-03-03 多维数组的存储(行优先/列优先)
一、定位信息
| 项目 | 内容 |
|---|---|
| 所属圈层 | 核心层 |
| 考点热度 | M级(中频常考) — 数组存储地址计算在408选择题中偶有出现,通常2分,主要考查行优先/列优先地址公式的应用 |
| 前置知识回顾 | 需理解"数组"的基本概念(连续存储的线性表),以及基本的地址计算原理(每个元素占 个字节) |
| 知识网络定位 | 多维数组的存储方式是特殊矩阵压缩存储的基础,理解行优先/列优先的地址映射才能掌握后续的压缩存储下标计算 |
二、知识点讲解
2.1 数组的定义
数组(Array) 是由相同类型的数据元素构成的有限序列,每个元素通过下标唯一标识。
- 一维数组:线性结构,元素按下标线性排列
- 二维数组:可视为"数组的数组",即每个元素本身是一个一维数组
- 维数组:递归定义
直观理解:二维数组就是一个表格(矩阵),有行有列。例如 是一个3行4列的矩阵,元素 位于第 行第 列。
2.2 行优先存储(Row-Major Order)
行优先:将二维数组的元素按行依次存入连续内存。先存第0行,再存第1行,依此类推。
存储顺序:
地址公式(下标从0开始,首地址为 ):
其中 为列数, 为每个元素占用的字节数。
推导:元素 前面有 行完整的元素(每行 个),加上当前行中 个元素,共 个元素,每个占 字节。
示例:(3行4列), 字节,首地址为 100。
2.3 列优先存储(Column-Major Order)
列优先:将二维数组的元素按列依次存入连续内存。先存第0列,再存第1列,依此类推。
存储顺序:
地址公式(下标从0开始):
其中 为行数, 为每个元素占用的字节数。
推导:元素 前面有 列完整的元素(每列 个),加上当前列中 个元素,共 个元素。
2.4 下标从1开始的地址公式
若数组下标从1开始(即 ),则:
- 行优先:
- 列优先:
408考试注意:审题时一定要确认下标是从0还是从1开始,选用对应公式!
2.5 维数组的地址计算
设 维数组 ,每维大小为 ,元素 。
行优先(即最后一维变化最快)地址公式:
此公式在408中很少直接考查高维情况,但理解其推导逻辑有助于应对变式题。
三、记忆与理解辅助
技巧1:行优先/列优先口诀
"行优先——行不变列先变,列优先——列不变行先变"
或者:
"行优先按行排,一行存完存下一行;列优先按列排,一列存完存下一列"
技巧2:行优先 vs 列优先对比表
| 比较项 | 行优先 | 列优先 |
|---|---|---|
| 存储顺序 | 先存完一行,再存下一行 | 先存完一列,再存下一列 |
| 地址公式 | ||
| 快速访问 | 按行遍历快(连续存储) | 按列遍历快(连续存储) |
| 采用语言 | C/C++、Java、Python | Fortran、MATLAB、R |
| 408默认 | 行优先(C语言风格) | — |
技巧3:地址计算通用思路
无论行优先还是列优先,核心思路是:
- 数前面有多少个元素:按存储顺序,当前元素前面有多少个元素
- 乘以每个元素的字节数:得到偏移量
- 加上首地址:得到实际地址
技巧4:快速验证法
计算完地址后,用特殊位置验证:
- (或 )应该等于首地址
- 相邻行同列元素的地址差应为 (行优先)或 (列优先)
- 相邻列同行元素的地址差应为 (行优先)或 (列优先)
四、例题与精解
例题1(基础)
题目:已知二维数组 (6行8列)按行优先存储,每个元素占4个字节,首地址为 200。求元素 的存储地址。
命题意图:考查行优先地址公式的直接应用。
审题分析:
- 已知:下标从0开始,,,,
- 求解:
解题思路: 直接代入行优先地址公式。
完整步骤:
验证: 前面有 个元素,每个4字节,偏移116字节, ✓
方法反思:代入公式前先确认下标起始值和行列数,避免混淆 和 。
例题2(中等)
题目:二维数组 按列优先存储,首地址为 1000,每个元素占 8 字节。已知元素 的地址为 1168,求 和 的值。
命题意图:考查列优先地址公式的逆向应用(已知地址求下标)。
审题分析:
- 已知:下标从1开始,,,,,
- 求解: 和
解题思路: 列优先、下标从1开始的地址公式为:
代入已知值,求解方程。
完整步骤:
由于 ,所以 。
设 ,用除法分解:
- 所以 ,
- 即 ,
验证: ✓
方法反思:
- 逆向求解的关键是带余除法:总元素序号除以每列元素数得到列偏移,余数为行偏移
- 注意下标从1开始时公式中要减1
- 此类题在408选择题中较常见,建议熟练掌握正向和逆向两个方向的计算
五、考情分析
| 分析维度 | 内容 |
|---|---|
| 考查频次 | 近5年出现1–2次(选择题为主),属于中低频考点 |
| 常见题型 | 选择题(地址计算、已知地址求下标) |
| 分值占比 | 通常2分(选择题一道) |
| 命题趋势 | 单独出题较少,但作为矩阵压缩存储的基础,可能与压缩存储结合考查 |
注:以上频次基于大纲权重与通用命题规律推测,待真题分析后校准。
六、易错点提醒
易错点1
- 错误表现:行优先公式中把 (行数)和 (列数)搞反
- 错误原因:行优先的关键是"一行有多少个元素"即列数 ,但容易误用行数
- 正确做法:行优先公式中的系数是列数 (因为一行有 个元素),列优先公式中的系数是行数 (因为一列有 个元素)
易错点2
- 错误表现:下标从1开始时忘记减1,直接套用下标从0的公式
- 错误原因:考试中两种下标约定都可能出现,审题不仔细
- 正确做法:看到下标从1开始,公式中必须将 替换为 、 替换为
易错点3
- 错误表现:列优先地址计算时,误将"前面元素个数"算成 而非
- 错误原因:与行优先公式混淆
- 正确做法:记住核心原则——"前面有多少个元素"。列优先时,先算前面有多少个完整列( 列,每列 个),再加上当前列中 个元素
易错点4
- 错误表现:忽略每个元素占用的字节数 ,直接把元素个数当地址偏移
- 错误原因:忘记"地址偏移 = 元素个数 × 每个元素字节数"
- 正确做法:始终区分"元素序号"和"字节偏移",最终地址 = 首地址 + 元素序号 ×
七、来源标注
- 依据2026考研统考大纲(408计算机学科专业基础综合)
- 依据《数据结构(C语言版)》严蔚敏版
- 依据《数据结构》王道考研辅导讲义