本讲定位:整个三级最大的一道坎。总纲 §6 为数组留了三次课(本讲 + 第 05 讲 + 富余时间),原因不是数组的语法复杂——语法只有一行——而是学生第一次要面对”一个名字装很多个值”和”编号从 0 开始”这两个观念。前面三讲(进制 / 编码 / 位运算)是背和算,从本讲起,三级真正变成编程课。官方大纲三级知识块 5 只写了一句「C++ 一维数组(不包括变长数组)」,但编程题的两道题里至少一道要用数组。
对应官方大纲:三级知识块 5「数据结构」——C++ 一维数组(不包括变长数组)。
前置知识:一级第 03 讲(变量)、一级第 04 讲(数据类型)、一级第 08 讲(循环——数组和
for是连体的,循环不熟就别学数组)、二级第 07 讲(多重循环)。代码说明:本讲所有代码均已用 g++ 11.5(
-std=c++11)编译运行验证,输出结果即为文中标注结果。
题目:输入 100 个整数,倒序把它们输出。
用我们目前会的东西试试:
int a1, a2, a3;
cin >> a1 >> a2 >> a3;
cout << a3 << " " << a2 << " " << a1;
三个数还能凑,100 个数就要定义 100 个变量、写 100 次 cin、写 100 次 cout。如果题目改成”输入 $n$ 个数”($n$ 事先不知道),这条路直接走不通。
根本困难在哪?
📌 数组就是为这两件事发明的:
$$ \boxed{\textbf{一个名字 + 一个编号}\ \longrightarrow\ \textbf{可以用循环变量当编号}} $$
有了数组,上面这道题只要 6 行。这就是本讲的全部动机。
类比:一个普通变量是一个抽屉,数组是一整排连号的抽屉。
int a[5]; ← 申请一排 5 个抽屉,每个都能装一个 int
编号: 0 1 2 3 4
┌─────┬─────┬─────┬─────┬─────┐
a = │ │ │ │ │ │
└─────┴─────┴─────┴─────┴─────┘
a[0] a[1] a[2] a[3] a[4]
三个术语(真题会用这些词):
| 术语 | 含义 |
|---|---|
| 数组名 | 这一排抽屉的总名字,上例是 a |
| 下标(索引) | 抽屉的编号,上例是 $0\sim4$ |
| 元素 | 某一个抽屉里的值,a[2] 就是第 3 个元素 |
| 数组长度(大小) | 抽屉总数,上例是 5 |
关键性质:
int a[5] 里五个格子全是 int,不能一个装整数一个装小数。