5. 数组

用数组存五个英雄的血量、多局对战数据。本节对应考纲 5。

这一章在学什么

之前一个变量只能存一个数(如一个 hero_hp)。数组就是「一排格子」,用同一个名字加下标来访问,比如 hero_hp[0]hero_hp[1] 表示第 1 个、第 2 个英雄的血量。

重要:下标从 0 开始。长度为 5 的数组,下标是 0、1、2、3、4,没有 5。考试经常考「arr[3] 是第几个元素」——是第 4 个。

本节考纲要点

本节代码里的英文词

为什么用数组

没有数组时的问题

如果要存 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;
}

下面练习区已预填了这段代码,可修改后点击「运行」。

练习区域

提示:注释可以暂时不写,等以后学熟了再慢慢加。请仿照上面数组代码在下面输入或修改,点击「运行」。

运行结果:

(点击「运行」后显示在这里)

易错知识(避免踩坑)

小结