13.2.2 数组
数组是顺序存储结构的典型代表。它的关键优势是随机访问:只要知道首地址、元素长度和下标,就能直接算出元素地址。
一维数组地址
若一维数组首元素 A[0] 地址为 a,每个元素占 L 个存储单元,则:
若下标从 1 开始,首元素 A[1] 地址为 a:
这就是数组读取第
二维数组:先想“前面已经存了多少元素”
二维数组要转成一维连续空间存储。地址计算的核心不是背公式,而是数清楚目标元素之前已经存了多少个元素。
设数组为 A[m][n],即
按行优先:
解释:前面有 i 整行,每行 n 个元素;当前行前面还有 j 个元素。
按列优先:
解释:前面有 j 整列,每列 m 个元素;当前列前面还有 i 个元素。
下标从 1 开始时
若二维数组行列下标均从 1 开始,数组为
按行优先:
按列优先:
考试题经常通过下标起点设坑。看到 A[1..m,1..n] 与 A[0..m-1,0..n-1],公式里的偏移量不同。
方阵中行优先与列优先的特殊比较
课程用
下标从 1 开始时:
按行偏移元素个数:
按列偏移元素个数:
令二者相等:
整理可知,当 A[1][1] 必然都是第一个元素。
地址计算做题流程
mermaid
flowchart TD
A["读题"] --> B["确认下标从 0 还是 1 开始"]
B --> C["确认数组维度:m 行 n 列"]
C --> D["确认按行优先还是按列优先"]
D --> E["计算目标元素前面的元素个数"]
E --> F["乘以元素长度 L"]
F --> G["加首地址 a"]本节例题
二维数组 $A[1..m][1..n]$ 按行优先存储,每个元素长度为 $L$,首地址为 $a$,则 $A[i][j]$ 的地址为:
自查清单
- 能否不背公式,直接数出目标元素前面有多少元素?
- 能否区分下标从 0 与从 1 开始的公式?
- 能否解释方阵主对角线元素为什么行优先和列优先偏移相同?