# 数组

> 计算机科学 · CIE A-Level 9618
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u10-arrays/

本模块讲解一维和二维数组，这是用于存储同构数据集合的核心静态数据结构。你将学习数组的声明、索引、常见操作，以及如何避开考试陷阱。

**先修:** [原始数据类型](https://www.owlsprep.com/zh/study/cie-9618-u10-primitive-data-types/); [基础内存概念](https://www.owlsprep.com/zh/study/cie-9618-u09-memory-allocation/)

## 学习目标

- 解释数组的核心结构和内存分配方式
- 正确声明和访问一维与二维数组的元素
- 针对考题实现常见的数组操作
- 避免常见的偏移一错误和索引错误

## 核心概念与一维数组

**一维（1D）数组** — 存储在连续内存中的同类型元素线性集合。每个元素通过相对于数组起始地址的单个索引偏移量访问。

*记法:* DECLARE name[size] : DATA_TYPE

*例:* 存储10个学生考试分数的整数数组

与单个变量不同，数组将相关数据分组在一起，便于通过循环处理所有元素。它们是入门编程中最常用的数据结构，几乎出现在每一道试卷2的编程题中。

**例题:** 声明一个名为`temperatures`的包含5个浮点数的一维数组，将第一个元素初始化为22.5，输出第三个元素（零索引）。

1. 1. 用正确的类型、名称和大小声明数组：
2. $$\text{DECLARE } temperatures[5] : \text{REAL}$$
3. 2. 初始化索引0处的第一个元素：
4. $$temperatures[0] = 22.5$$
5. 3. 第三个元素在索引2处，因此输出它：
6. $$\text{OUTPUT } temperatures[2]$$

> **考试提示:** 编写代码前，请务必确认题目中给出的索引约定。

## 二维（2D）数组

**二维（2D）数组** — 数组的数组，结构为包含行和列的网格。每个元素通过两个索引访问：第一个是行索引，第二个是列索引。

*记法:* DECLARE name[rows][columns] : DATA_TYPE

*例:* 井字棋游戏的3×3棋盘网格

二维数组在考题中通常用于表示网格、矩阵、表格和游戏棋盘。试卷1也可能要求你计算行优先或列优先存储顺序下二维元素的内存地址。

**例题:** 声明一个名为`gameGrid`的4行6列二维整数数组，将（零索引下的）第2行第5列的元素设为10。

1. 1. 先声明行数，再声明列数：
2. $$\text{DECLARE } gameGrid[4][6] : \text{INTEGER}$$
3. 2. 第2行 = 索引1，第5列 = 索引4，因此赋值：
4. $$gameGrid[1][4] = 10$$

**概念自测**

测试你的理解：

1. 在零索引二维数组中，访问第一行第一列元素的索引是什么？

   - [0][0]
   - [1][1]
   - [0][1]
   - [1][0]

   *解析:* 正确！零索引从0开始计数，因此每个维度的第一个元素索引都是0。

## 考试常考数组操作

考试中最常考的数组操作包括遍历（迭代所有元素）、查找最大值/最小值、计算总和/平均值、线性搜索、插入和删除。所有这些操作都使用循环通过索引访问元素。

**例题:** 编写伪代码，在包含10个整数的零索引一维数组`scores`中查找最大值。

1. 1. 将最大值初始化为数组的第一个元素：
2. $$maxScore = scores[0]$$
3. 2. 从第二个元素（索引1）开始遍历数组：
4. $$\text{FOR } i = 1 \text{ TO } 9$$
5. $$\quad \text{IF } scores[i] > maxScore \text{ THEN}$$
6. $$\quad \quad maxScore = scores[i]$$
7. $$\quad \text{END IF}$$
8. $$\text{END FOR}$$
9. 3. 循环结束后，`maxScore`即为数组的最大值。

> **warning**
>
> 对于大小为n的零索引数组，有效索引范围仅为0到n-1。访问此范围外的任何索引都会导致越界错误。

## 常见错误

- **错误做法:** 循环时的偏移一错误：对10个元素的零索引数组从1循环到10
  - 原因: 10个元素零索引数组的最后一个有效索引是9，因此访问索引10是越界访问
  - 正确做法: 对于大小为n的零索引数组，从0循环到n-1，与题目给出的约定一致
- **错误做法:** 声明或访问二维数组时交换行和列索引
  - 原因: CIE伪代码默认使用[行][列]约定，交换会导致错误的大小声明和错误的元素访问
  - 正确做法: 始终先写行索引/大小，再写列索引/大小
- **错误做法:** 假设数组是动态的，可以增长到超过声明的大小
  - 原因: 静态数组（9618课程中讲授的标准数组）在声明时大小固定，程序执行期间无法调整大小
  - 正确做法: 在程序开始时声明一个足够大的数组，可容纳所有可能的输入值
- **错误做法:** 不检查题目就假设所有数组都是零索引
  - 原因: 有些考题为了简化明确使用一索引，因此使用零索引会导致错误结果
  - 正确做法: 编写任何代码前，始终先阅读题目描述确认索引约定

## 速查表

| 概念 | 核心要点 | 伪代码示例 |
| --- | --- | --- |
| 一维数组声明 | 大小固定，元素同类型 | DECLARE scores[10] : INTEGER |
| 二维数组声明 | 先声明行，再声明列 | DECLARE grid[3][3] : INTEGER |
| 零索引一维数组 | 大小为n时索引范围0到n-1 | FOR i ← 0 TO 9 |
| 一索引一维数组 | 大小为n时索引范围1到n | FOR i ← 1 TO 10 |
| 二维元素访问 | 先行索引，后列索引 | grid[row][col] |
| 查找最大值 | 从第一个元素开始迭代 | max = arr[0]   IF arr[i] > max THEN max = arr[i] |

## 下一步

数组是你在A-Level计算机科学中学习几乎所有更复杂数据结构的基础。理解数组如何在连续内存中存储数据，对于理解链表、栈、队列和哈希表的工作方式至关重要，因为所有这些结构通常都使用数组作为底层存储层。掌握遍历、搜索等数组操作也能培养你在试卷2中解决复杂编程问题所需的核心算法思维。接下来，你将学习如何使用记录组合不同的数据类型，之后再学习更高级的算法和动态数据结构。

- [记录](https://www.owlsprep.com/zh/study/cie-9618-u10-records/)
- [链表](https://www.owlsprep.com/zh/study/cie-9618-u10-linked-lists/)
- [栈](https://www.owlsprep.com/zh/study/cie-9618-u10-stacks/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u10-arrays/
