CC++ & Algorithm

一维数组:像一排整齐的储物柜

中等17
语言版本:C++
概述:一维数组就像一排编号的储物柜,每个格子可以存放一个数据,通过编号快速找到。

一维数组:像一排整齐的储物柜——C++数组入门详解

小朋友,你有没有在学校里见过一排排整齐的储物柜?每个柜子上都有一个号码,打开柜子就能拿出里面的东西。比如,你有一个1号柜放数学书,2号柜放语文书,3号柜放英语书……找东西时只看号码,一秒就能找到。在C++里,一维数组就像这样一排储物柜,它把相同类型的数据(比如很多个数字、很多个字符)整整齐齐地排成一列,每个数据都有一个自己的“编号”(我们叫它下标)。注意:数组的下标从0开始,就好像储物柜的编号从0号开始,而不是1号。

有了数组,你就不用为每个数据单独起一个变量名了(比如 score1、score2、score3……),而是用一个名字加下标来管理一大堆数据,特别方便。


1. 什么是数组?—— 一排编号的格子

数组是一块连续的内存空间,里面装满了相同类型的数据。每个格子都有自己的位置(下标),你可以像拿快递一样,通过下标快速取出或修改格子的内容。

生活中的例子

  • 你一周7天的零花钱:周一20元,周二15元,周三30元……用一个数组 pocket[7] 就能存下这7天的钱。
  • 全班40个同学的身高:height[40],用下标0~39对应第1到第40个同学。

2. 怎么定义一个数组?—— 告诉C++:名字、类型、个数

你只需要告诉C++:这个数组叫什么名字、里面放什么类型的数据、一共有几个格子。

基本格式:

数据类型 数组名[元素个数];

比如,要存放5个同学的分数,可以这样写:

int scores[5];  // 定义一个能放5个整数的数组,名字叫scores

这就在内存里开辟了5个连续的小格子,它们的下标分别是0、1、2、3、4。注意:格子数量是5,但下标最大是4(因为从0开始)。

多种定义方式:

  • 只声明,不初始化(格子里的值是随机的,需要自己放数据):
    int ages[10];  // 声明一个存放10个年龄的数组,初始值未知
    
  • 声明并初始化(花括号里放初始值,数量和声明个数要匹配):
    int scores[5] = {90, 85, 92, 88, 78};  // 定义并初始化,下标0对应90,下标1对应85……
    
  • 省略元素个数,由初始值决定
    int scores[] = {90, 85, 92, 88, 78};  // 编译器自动数出5个元素,等价于 scores[5]
    

3. 怎么往数组里放数据和取数据?—— 用下标当钥匙

使用 数组名[下标] 就能访问对应的格子。下标必须是整数(也可以是整数表达式),范围从0到元素个数-1。

赋值(放数据):

scores[0] = 90;  // 把90放到下标0的格子(第一个格子)
scores[4] = 78;  // 把78放到下标4的格子(最后一个格子)

取值(取数据):

cout << scores[0];  // 输出第一个格子的值(90)
int first = scores[0];  // 把第一个格子的值赋给变量 first

用变量当下标:

int index = 2;
scores[index] = 95;  // 等价于 scores[2] = 95,把第三个格子的值改成95

4. 数组与循环:批量操作的绝配

数组配合循环,可以批量处理所有数据,再也不用一个一个地写代码了。循环变量 i 从0开始,一直跑到元素个数-1,就可以访问每个格子。

例子:用循环输入10个同学的分数

#include <iostream>
using namespace std;
int main() {
    int scores[10];  // 定义一个存放10个分数的数组
    cout << "请输入10位同学的分数:" << endl;
    for (int i = 0; i < 10; i++) {
        cin >> scores[i];  // 循环输入,依次填写每个格子
    }
    // 循环输出所有分数
    cout << "所有分数为:";
    for (int i = 0; i < 10; i++) {
        cout << scores[i] << " ";
    }
    return 0;
}

再比如:统计全班平均分、最高分

#include <iostream>
using namespace std;
int main() {
    int scores[5] = {90, 85, 92, 88, 78};  // 定义并初始化
    int sum = 0;       // 定义变量sum,用来累加总分,初始为0
    int max_score = 0; // 定义变量max_score,用来记录最高分,初始为0
    for (int i = 0; i < 5; i++) {
        sum = sum + scores[i];  // 累加每个分数
        if (scores[i] > max_score) {
            max_score = scores[i];  // 更新最高分
        }
    }
    double avg = sum / 5.0;  // 计算平均分,注意用5.0而不是5,避免整数除法
    cout << "总分:" << sum << endl;
    cout << "平均分:" << avg << endl;
    cout << "最高分:" << max_score << endl;
    return 0;
}

5. 新手常犯的错误 —— 踩坑预警

错误1:下标越界(最危险!)

数组下标只到元素个数-1,如果用了超过范围的下标,程序可能崩溃或出现奇怪的值。

int scores[5];
scores[5] = 100;  // 错误!下标最大是4,这个写操作会破坏未知内存

解决方法:写循环时确保 i < 数组长度,不要写成 <=

错误2:未初始化就使用

声明数组后,如果没给初始值,里面的值是随机垃圾(取决于内存之前的内容),直接使用会导致错误结果。

int scores[5];      // 未初始化
cout << scores[0];  // 输出一个不确定的数(可能是0,也可能不是)

解决方法:要么在声明时用花括号初始化,要么在第一次使用前用循环赋值。

错误3:赋值时忘记加下标

int scores[5];
scores = 100;  // 错误!不能直接给数组名赋值,必须 scores[某个下标]

解决方法:永远记住用 数组名[下标] 访问单个元素。

错误4:循环条件写错导致遗漏或越界

for (int i = 1; i <= 5; i++) {  // 错误!下标从0开始,且i<=5会导致越界
    cin >> scores[i];           // 会访问 scores[5],越界
}

正确写法for (int i = 0; i < 5; i++),用 < 而不是 <=


6. 完整示例:用数组管理一周零花钱并统计

假设你一周7天的零花钱分别是:周一10元,周二15元,周三8元,周四20元,周五12元,周六25元,周日30元。用数组存起来,然后计算总花费、平均每天花费、以及哪一天花得最多。

#include <iostream>
using namespace std;
int main() {
    // 定义数组并初始化一周零花钱,共7天
    int money[7] = {10, 15, 8, 20, 12, 25, 30};
    // 定义变量
    int total = 0;      // 累计总花费
    int max_money = 0;  // 记录最大花费
    int max_day = 0;    // 记录最大花费的星期几(下标)
    // 用循环遍历所有天数
    for (int i = 0; i < 7; i++) {
        total = total + money[i];          // 累加每天零花钱
        if (money[i] > max_money) {        // 如果当天花费大于当前最大值
            max_money = money[i];          // 更新最大值
            max_day = i;                   // 记录下标(0代表周一,1代表周二……)
        }
    }
    double avg = total / 7.0;  // 平均每天花费,用7.0保证浮点数结果
    cout << "一周总零花钱:" << total << "元" << endl;
    cout << "平均每天:" << avg << "元" << endl;
    cout << "花费最多的一天是第" << max_day + 1 << "天(周" << char('一' + max_day) << "),花了" << max_money << "元" << endl;
    // 注意:中文星期显示不是重点,这里只是示意
    return 0;
}

运行结果:

一周总零花钱:120元
平均每天:17.1429元
花费最多的一天是第7天(周日),花了30元

是不是很简单?数组让很多数据的管理变得井井有条,就像一排编号清楚的储物柜一样。


7. 相关知识点指引

学会了一维数组,接下来你可以探索:

  • 二维数组:像电影院座位,有行号和列号,适合处理矩阵、表格数据。
  • 字符串:C++的字符串其实就是一个字符数组(例如 char name[20]),学会数组后更容易理解字符串。
  • 排序:比如冒泡排序、选择排序,都需要用数组存储数据并进行交换。
  • 循环嵌套:处理二维数组时,需要循环里面再套循环。

记住:数组是编程里的“基础积木”,后面很多知识都建立在它的基础上。多动手写几个数组程序,比如统计考试成绩、记录比赛得分,很快你就能熟练运用啦!

例题精讲

1单选题

定义一个数组 int a[10]; 则正确的下标范围是?

A0~9
B1~10
C0~10
D1~9
2判断题

在C++中,数组名a代表数组第一个元素的地址,即&a[0]。

3单选题

执行 int a[5] = {1, 2, 3}; 后,a[4] 的值是?

A0
B3
C随机值
D4
4填空题
以下代码用于计算数组元素之和,请填空。
int sum = 0;
int arr[5] = {10, 20, 30, 40, 50};
for(int i = 0; i < 5; ___) {
    sum += arr[i];
}
5判断题

访问数组元素 a[10] 当数组定义为 int a[10]; 时不会导致程序错误。