数组(一维与二维)
一句话目标:当你要存”一排同类型的数据”时,不用开 100 个变量 —— 用数组,一个名字管一排盒子。
数组属于复合类型(用已有类型搭出来的),同类的还有字符串、结构体、指针等。
第一部分:定义数组
int a[5]; // 定义 5 个 int,名字叫 a三个要点:
int是元素类型,a是数组名,5是大小(能装几个)。- 大小必须是整数或整数常量表达式,不能用变量。
- 数组在内存里是连续的一整块。
要用变量般的大小,请用常量:
const int maxn = 1001;
int a[maxn]; // 推荐写法
#define N 1001
int a[N]; // 老式写法,也可以第二部分:下标(索引)
数组用下标访问每个元素,从 0 开始:
int a[5];
a[0] a[1] a[2] a[3] a[4]
a[0]是第 1 个,a[4]是第 5 个(最后一个)。- 竞赛小技巧:把数组开大一点、舍弃
a[0]、从a[1]开始用,这样”a[i]就是第 i 个”,下标和题意对得上,少出错。
⚠️ 下标越界很危险:编译器不检查下标是否有效。写
a[5](越界)能编译通过,但运行时可能破坏别的数据甚至崩溃。开够大小是基本功。
第三部分:初始化
int a[4]; // 不初始化,里面是随机值(垃圾值)
int a[4] = {20, 345, 700, 22}; // 定义同时逐个赋值
int a[10] = {12, 19, 22}; // 只给前 3 个赋值,后 7 个自动补 0
int a[10] = {1}; // 思考:a[0]=1,其余 9 个都是 0!
int a[10] = {0}; // 常用:整个数组清零记住规则:花括号里给了的就用给的值,没给到的一律补 0。
所以{1}不是”全 1”,而是”第一个是 1,其余是 0”。要全 1 只能一个个写。
第四部分:遍历数组(配合循环)
数组和 for 循环是黄金搭档:
int n;
cin >> n;
int a[1005];
for (int i = 1; i <= n; i++) cin >> a[i]; // 读入 n 个数(从 a[1] 开始)
int sum = 0;
for (int i = 1; i <= n; i++) sum += a[i]; // 求和
cout << sum;第五部分:二维数组
存”表格 / 矩阵”这类有行有列的数据:
int g[3][4]; // 3 行 4 列
g[i][j] // 第 i 行、第 j 列遍历要用嵌套循环(呼应循环那一课”外层管行、内层管列”):
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
cin >> g[i][j];
}
}小结
- 数组 = 一排连续的同类型盒子,一个名字 + 下标访问。
- 下标从 0 开始;越界不报错但危险,数组要开够大。
- 初始化规则:没给到的补 0;
{0}清零,{1}只有首位是 1。 - 一维配单层 for,二维配嵌套 for。
课后小练
- 输入 n 个数,逆序输出(洛谷 B2089 类)。
- 输入 n 个数,找出最大值及其下标。
- 数组作业:洛谷 B2089–B2093、P1427。
衔接:学完数组,下一步常接选择排序等简单排序 —— 见排序专题。