二维数组 A[0..3][0..5] 按行优先顺序连续存储,每个元素占 4 字节,A[0][0] 的首地址为 1000。A[2][3] 的首地址是()。
按行存储时,要先跨过前面的完整行。每行有 6 个元素,A[2][3] 前面共有 2×6+3=15 个元素,因此地址为 1000+15×4=1060。
选项分析
把行、列下标简单相加后乘元素长度,漏掉了每一整行包含 6 个元素。
这是按列优先计算得到的结果:1000+(3×4+2)×4=1056,与题设存储顺序不符。
正确。1000+(2×6+3)×4=1060。
多跨过了一个元素,常见原因是把目标元素本身也算进了前置元素数量。
本题为什么容易错
数组地址题很少难在乘法,真正容易错的是边界。题目已经写明下标从 0 开始,所以第 2 行之前只有两行;A[2][3] 之前只有本行的 0、1、2 三个位置。
简短答案
二维数组按行存储时,A[2][3] 的地址怎么计算,正确答案是 C(1060)。按行存储时,要先跨过前面的完整行。每行有 6 个元素,A[2][3] 前面共有 2×6+3=15 个元素,因此地址为 1000+15×4=1060。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 1020 | 本题干扰项 | 把行、列下标简单相加后乘元素长度,漏掉了每一整行包含 6 个元素。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 1056 | 本题干扰项 | 这是按列优先计算得到的结果:1000+(3×4+2)×4=1056,与题设存储顺序不符。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 1060 | 本题正确答案 | 正确。1000+(2×6+3)×4=1060。 | 看到题干核心场景时优先联想到它 |
| 1064 | 本题干扰项 | 多跨过了一个元素,常见原因是把目标元素本身也算进了前置元素数量。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 1020:把行、列下标简单相加后乘元素长度,漏掉了每一整行包含 6 个元素。
- 1056:这是按列优先计算得到的结果:1000+(3×4+2)×4=1056,与题设存储顺序不符。
- 1064:多跨过了一个元素,常见原因是把目标元素本身也算进了前置元素数量。
知识点详解
数组的逻辑下标必须映射到连续的物理地址。按行优先时,同一行的元素连续,跨到下一行前要越过一整行的列数;按列优先则相反。若数组下界不是 0,应使用(当前下标-下界)计算相对位置。
备考速记
按行先乘列数,按列先乘行数;先数元素,再乘字节。
数据结构在数据结构场景中的作用
数据结构在本题中的核心价值,是解决“二维数组 A[0..3][0..5] 按行优先顺序连续存储,每个元素占 4 字节,A[0][0] 的首地址为 1000。A[2][3] 的首地址是()”这个场景问题。复习时不要只背选项名称,还要理解它为什么适用于该场景,以及它能解决哪类安全、流程或管理问题。
同类题怎么考
- 一维数组给定下界后的地址计算
- 二维数组按行或按列存储的地址计算
- 三维数组线性化后的偏移量判断
数据结构在软件设计师软考中的考法
软考选择题通常不会只考概念定义,还会把数据结构放到数据结构场景中,要求判断它的作用、适用范围或与相近概念的区别。遇到这类题时,先抓住题干中的业务场景,再看哪个选项最能解决该场景下的核心问题。
解题思路
我讲这类题时,会让同学先把 A[2][3] 前面的两整行圈出来。两行是 12 个元素,本行再跨过 A[2][0]、A[2][1]、A[2][2] 三个元素,一共 15 个。最后乘 4 字节,而不是把下标直接乘 4。
考点定位
地址题先数前面有多少个元素,再乘每个元素占用的字节数。按行存储的核心式子是:基址+(行下标×列数+列下标)×元素长度。
易错提醒
- 把按行优先误看成按列优先
- 把最大列下标 5 当成每行只有 5 个元素
- 计算前置元素时把目标元素也包含进去
备考提示
- 遇到非零下界时,先把行列下标分别减去下界再代公式。
- 先写元素偏移量 15,再换算成字节偏移量 60,分两步更稳。
你可能还想了解
- 二维数组按行存储地址公式是什么?
- 数组下标从0开始怎么计算偏移量?
- 按行优先和按列优先有什么区别?
- 二维数组元素占多个字节时地址怎么算?
本文小结
A[2][3] 前面有 2×6+3=15 个元素,每个元素占 4 字节,所以首地址为 1000+15×4=1060。