题目
二维数组A[3][4]按行优先连续存储,下标从0开始。若A[0][0]的地址为1000,每个元素占2字节,则A[2][1]的地址是()。
题目类型:原创高频练习题
用途:用于帮助理解程序员相关考点和答案解析,不等同于官方真题。
正确答案
C
按行存储时,A[2][1]前面有2个完整行共2×4=8个元素,再加本行前面的1个元素,共偏移9个元素。字节偏移为9×2=18,所以地址为1000+18=1018。
选项分析
A
错误。只考虑了部分下标,没有跨过前两整行。
B
错误。把行、列或元素长度混算。
C
正确。偏移9个元素,即18字节。
D
错误。把数组总容量或其他边界当成目标地址。
本题为什么容易错
最容易错的不是乘法,而是把A[2][1]看成第2行第1列。题目已说下标从0开始,它实际位于第3行第2列。
先看结论
简短答案
二维数组按行优先存储时,A[2][1]的地址怎么计算,正确答案是 C(1018)。按行存储时,A[2][1]前面有2个完整行共2×4=8个元素,再加本行前面的1个元素,共偏移9个元素。字节偏移为9×2=18,所以地址为1000+18=1018。
解析
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 1006 | 本题干扰项 | 错误。只考虑了部分下标,没有跨过前两整行。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 1010 | 本题干扰项 | 错误。把行、列或元素长度混算。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 1018 | 本题正确答案 | 正确。偏移9个元素,即18字节。 | 看到题干核心场景时优先联想到它 |
| 1024 | 本题干扰项 | 错误。把数组总容量或其他边界当成目标地址。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 1006:错误。只考虑了部分下标,没有跨过前两整行。
- 1010:错误。把行、列或元素长度混算。
- 1024:错误。把数组总容量或其他边界当成目标地址。
复习
知识点详解
对于下标从0开始、共有N列的按行数组A[i][j],前置元素数为i×N+j,地址为base+(i×N+j)×elementSize。
备考速记
按行存:先跨i整行,再走j格,最后乘字节。
数组下标在数组下标场景中的作用
若同一数组按列优先存储且共有M行,则前置元素数变为j×M+i。判断存储顺序要在代数前完成。
拓展
同类题怎么考
- 给基地址和元素长度计算二维数组元素地址。
- 比较按行优先与按列优先的偏移公式。
数组下标在程序员软考中的考法
把目标位置前的元素格涂出来,确认数量后再乘字节数,公式不易背反。
解题思路
老师建议别急着套公式,先数完整行:前两行8个,再数当前行左边1个,共9个。每个2字节,答案就是1000+18,选C。
考点定位
地址偏移按前面有多少元素计算,最后才乘元素字节数;下标从0还是1开始会直接改变公式。
易错提醒
- 用行数3代替列数4参与偏移。
- 算出9后忘记乘元素长度2。
- 未确认按行优先还是按列优先。
备考提示
- 先数前面的完整行,再数本行前面的元素。
- 书木兰软考题库 https://www.shumulan.com/ 做数组章节时,可把‘下标起点错、行列数错、字节数漏乘’分成三类错题复盘。
你可能还想了解
- 二维数组按行地址怎么算?
- 为什么偏移要乘元素字节数?
- 按列优先公式是什么?
本文小结
A[2][1]前有9个元素,每个2字节,因此按行存储地址为1000+9×2=1018。