5. 数组
用数组存五个英雄的血量、多局对战数据。本节对应考纲 5。
这一章在学什么
之前一个变量只能存一个数(如一个 hero_hp)。数组就是「一排格子」,用同一个名字加下标来访问,比如 hero_hp[0]、hero_hp[1] 表示第 1 个、第 2 个英雄的血量。
重要:下标从 0 开始。长度为 5 的数组,下标是 0、1、2、3、4,没有 5。考试经常考「arr[3] 是第几个元素」——是第 4 个。
本节考纲要点
- 掌握 一维数组的定义及引用
- 掌握 二维数组的定义及引用
- 了解 字符数组的定义及引用
本节代码里的英文词
hero_hp— 英雄血量match— 对局(多局数据)hero_name— 英雄名字skill_name— 技能名printf— 输出到屏幕
为什么用数组
没有数组时的问题
如果要存 5 个英雄的血量,不用数组就要写 5 个变量:hero_hp1、hero_hp2……很麻烦。用数组就是“一排格子,共用一个名字,用下标(0、1、2…)区分第几个”。这样循环、批量处理都方便。
一维数组:定义与引用
定义格式与下标从 0 开始
定义格式:类型 数组名[长度]; 或 类型 数组名[长度] = { 值1, 值2, ... }; 例如 int hero_hp[5]; 表示 5 个整数的一维数组。
下标从 0 开始:第一个元素是 hero_hp[0],第二个是 hero_hp[1],……第五个是 hero_hp[4]。所以“第 2 号英雄”在数组里是 hero_hp[1](第 1 号是 hero_hp[0])。易错:长度为 5 的数组,合法下标是 0~4,写 hero_hp[5] 会越界出错。
怎么引用数组元素
引用(使用):用 数组名[下标] 来读或写某一个元素,可以当普通变量用:赋值、参与运算、传给 printf 等。
int hero_hp[5] = {3000, 2800, 3200, 2500, 2900}; /* 定义并赋初值 */
printf("2 号英雄血量:%d\n", hero_hp[2]); /* 输出第3个元素,即 3200 */
hero_hp[0] = 2500; /* 把第1个英雄的血量改成 2500 */
二维数组:定义与引用
什么时候用二维数组
当数据有“两维”时用二维数组,比如:第几局 × 第几个英雄。
定义与引用格式
定义:类型 数组名[行数][列数]; 如 int match[3][5]; 表示 3 行 5 列,可以想成 3 局、每局 5 个数据。
引用:数组名[行下标][列下标],下标也是从 0 开始。例如 match[1][2] 表示第 2 局第 3 个数据。
int match[3][5]; /* 3 局,每局 5 个英雄数据 */
match[0][0] = 3000; /* 第1局第1个英雄的血量 */
字符数组(了解)
字符数组存什么
英雄名、技能名是一串字符,用字符数组存。赋值时双引号里直接写中文,和第 2 节一样。
结束符 \0
字符串末尾会有一个看不见的 \0(结束符),所以数组长度要够放“字符数+1”。
char hero_name[] = "貂蝉"; /* 系统自动算长度 */
char skill_name[20] = "绽·风华"; /* 最多约 19 个字符 + 结束符 */
本章总示例(含 main)
本章讲的是数组:用下标访问多个同类型数据。下面是一段完整可运行的程序(一维数组存 3 个英雄血量,输出第 2 个)。
#include <stdio.h>
int main() {
int hero_hp[3] = {3000, 2800, 3200};
printf("2号英雄血量:%d\n", hero_hp[1]);
return 0;
}
下面练习区已预填了这段代码,可修改后点击「运行」。
练习区域
提示:注释可以暂时不写,等以后学熟了再慢慢加。请仿照上面数组代码在下面输入或修改,点击「运行」。
运行结果:
(点击「运行」后显示在这里)
易错知识(避免踩坑)
- 下标从 0 开始:长度为 n 的数组,下标是 0~n-1,没有 n。arr[3] 是第 4 个元素,不是第 3 个。
- 越界:访问 arr[10] 而数组只有 10 个元素(下标 0~9)会越界,可能报错或结果乱。
- 定义时长度要用常量:
int n=5; int a[n];在部分环境不行,考试常用常数如int a[5];。
小结
- 一维数组:
类型 名[长度];下标从 0 开始,最大下标是 长度-1。 - 二维数组:
类型 名[行][列];用 名[i][j] 访问。 - 字符数组:存字符串,双引号赋值;注意长度要留出结束符 \0。