Appearance
题目
已知二维数组 A 按行优先方式存储,每个元素占用 1 个存储单元。若元素 A[0][0] 的存储地址是 100, A[3][3] 的存储地址是 220 , 则元素 A[5][5] 的存储地址是( )。
错因
A
漏掉了列偏移。算出每行长度 后,套公式只算到 100 + 5*39 = 295,把 A[5][5] 当成"第 5 行的开头"。其实第 5 行内还要再走 5 列才到 A[5][5],应再加 5。这是地址计算最常见的失误之一:行偏移记得加,列偏移忘加。
C
下标按 1 开始算。把 A[5][5] 误当成第 5 行第 5 列的"第 5 个"元素(1-base),结果在正确值上多偏 1:100 + 5*39 + 5 + 1 = 301。题目和 C 语言惯例都是从 0 开始,A[5][5] 是该行的第 6 个元素,但相对偏移就是 5(因为 A[5][0] 偏移 0、A[5][1] 偏移 1……)。
D
列长 m 算错。把 220−100=120 直接除以 3(行差)得到 ,忽略了"行差 3 的同时还有 3 个列偏移"。再加上 1-base 偏差,得到 100 + 5*40 + 6 = 306。差错的起点是没把列偏移 计入方程。
总解析
第一步:建立行优先地址公式。
按行优先存储,二维数组 A 第 行第 列元素的地址为:
其中 为每行列数, 为每元素占用存储单元数。本题 。
第二步:用 A[3][3] 反推每行列数 m。
解出:
一个常见错误:把 直接除以 3 得 。这忽略了同时存在的列偏移 ,必须从 解。
第三步:代入 求 A[5][5]。
最终答案是 B(300)。
核对要点:① 行优先公式行项是 ,列项是 ;② 用基准点反推时两项偏移都要考虑;③ C 语言数组下标从 0 开始,A[5][5] 的相对位置就是 ,不再 +1。