CC++ & Algorithm

C++一维数组的定义与使用

中等30
语言版本:C++Python
概述:学会用数组把多个相同类型的数据放进一个“小格子集合”里,并像按座位号一样用下标找到它们。

一排带编号的储物柜——C++一维数组入门

你有没有去过学校的储物柜区?每个柜子都有一个门牌号,你打开对应的门,就能把书包、课本放进去。在C++里,数组(Array)就像这样一排编号的储物柜,专门用来存放 多个相同类型 的数据。比如你要记录全班50个同学的年龄,不需要写50个单独的变量,只需要一个 int age[50] 就搞定了。

数组里的每一个小格子叫作 元素(element),每个元素都有一个 下标(index),下标从 0 开始,就像柜子编号从0、1、2……这样排下去。你通过下标就能快速找到并操作对应的数据。


1. 什么是数组?——从生活例子说起

想象周末妈妈给你买了5包零食,你想记住每包的价格。你可以用5个独立的变量:

double price1 = 3.5;  // 第一包价格
double price2 = 5.0;  // 第二包价格
double price3 = 2.0;  // 第三包价格
double price4 = 4.5;  // 第四包价格
double price5 = 6.0;  // 第五包价格

但如果有100包零食呢?写100个变量太累人了!这时候数组就派上用场了:

double price[100];   // 一个柜子排,能放100个 double 类型的数据

数组 price 就像一排100个编号的柜子:

  • 下标0 → 柜子0:price[0] 放第一包的价格
  • 下标1 → 柜子1:price[1] 放第二包的价格
  • ……
  • 下标99 → 柜子99:price[99] 放第100包的价格

数组的三大特点

  • 所有元素必须是 相同类型(全是 int,或全是 double,不能混着来)。
  • 数组在内存中占 连续 的空间,就像一排紧挨着的柜子。
  • 数组的大小在定义时就要确定,之后不能随便变大或缩小。

2. 如何定义一个数组?——语法与例子

定义数组的固定格式是:

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

比如:

int age[5];          // 一个能存放5个整数的数组,名字叫 age
double height[10];   // 一个能存放10个 double 小数的高度数组
char grade[3];       // 一个能存放3个字符的数组(比如 'A', 'B', 'C')

如果你在定义数组时就知道里面放什么值,可以 直接初始化

int score[4] = {90, 85, 78, 93};  // 4个格子,依次装 90, 85, 78, 93
double money[3] = {12.5, 0.5, 100.0}; // 零花钱数组

还可以省略数组大小,编译器会根据花括号里的元素个数自动推断:

int score[] = {90, 85, 78, 93};   // 自动变成 int score[4]

如果你只初始化了部分元素,剩下的会被自动赋值为0:

int test[5] = {10, 20};  // 等价于 {10, 20, 0, 0, 0}

注意:如果定义时不初始化,数组里的值是 随机 的(内存里原来留下的垃圾值),不能直接使用,否则可能得到奇怪的结果。


3. 如何访问和修改数组元素?——下标操作

要取用或修改某个格子里的数据,就用 数组名[下标] 的形式。下标从0开始,到“元素个数 - 1”结束。

举个例子,你有一个存有3次考试分数的数组:

int exam[3] = {88, 92, 76};  // 三次考试分数
  • 查看第一次分数(下标0):exam[0] → 88
  • 查看第三次分数(下标2):exam[2] → 76
  • 把第二次分数(下标1)改为95:exam[1] = 95;

你也可以用变量当下标,比如循环时常用:

for (int i = 0; i < 3; i++) {
    cout << "第" << i+1 << "次考试分数: " << exam[i] << endl;
}

4. 数组的多种初始化方式(总结)

方式代码举例说明
完全初始化int a[3] = {1,2,3};所有格子都赋了值
部分初始化int a[5] = {1,2};前两个是1和2,后面三个是0
指定大小不初始化int a[10];每个格子是随机值,必须先赋值再使用
省略大小int a[] = {1,2,3,4,5};自动算成5个元素
所有元素赋0int a[100] = {0};全部初始化为0(注意:只能赋0,不能赋其他数)

5. 遍历数组——用循环把每个格子看一遍

最常见的操作是 遍历,就是依次访问数组的每个元素。比如记录一个班级5个学生的身高:

#include <iostream>
using namespace std;

int main() {
    // 定义一个存放5个学生身高的数组(单位:厘米)
    double height[5] = {150.5, 162.0, 148.5, 175.0, 158.5};
    
    // 用循环输出所有身高
    for (int i = 0; i < 5; i++) {
        cout << "第" << i+1 << "个学生的身高: " << height[i] << "厘米" << endl;
    }
    
    return 0;
}

运行结果:

第1个学生的身高: 150.5厘米
第2个学生的身高: 162厘米
第3个学生的身高: 148.5厘米
第4个学生的身高: 175厘米
第5个学生的身高: 158.5厘米

你也可以在遍历时修改数组,比如把所有身高加1厘米:

for (int i = 0; i < 5; i++) {
    height[i] = height[i] + 1;  // 每个格子数值+1
}

6. 新手最容易犯的3个错误

❌ 错误1:下标越界(访问了不存在的格子)

int arr[3] = {10, 20, 30};
cout << arr[3];  // 下标3不存在!数组只有0、1、2

这叫 数组越界。程序可能崩溃,或者输出莫名其妙的值。就像你只有3个柜子,却去开第4个门,当然会撞墙。

正确做法:下标范围永远在 0大小-1 之间。

❌ 错误2:定义数组时大小用了变量(C++标准不允许,但有些编译器扩展支持)

int n;
cin >> n;
int arr[n];  // 某些编译器报错,应使用动态分配或vector

正确的做法:要么用常量(如 int arr[100]),要么用 vector(后面会学到)。

❌ 错误3:未初始化就使用数组元素

int arr[3];
cout << arr[1];  // arr[1] 是随机值,结果不可预料

定义数组后最好立刻初始化,或者手动给每个格子赋值。


7. 完整示例:用数组计算总分和平均分

假设你有4门考试的成绩,存放在数组里。我们来计算总分和平均分。

#include <iostream>
using namespace std;

int main() {
    // 定义一个长度为4的整数数组,存放语数英科的成绩
    int subject[4] = {85, 92, 78, 88};
    
    // 用变量记录总分,初始为0
    int total = 0;
    
    // 用循环累加每个成绩
    for (int i = 0; i < 4; i++) {
        total = total + subject[i];
    }
    
    // 计算平均分(注意要转换成 double,否则整数除法会丢小数)
    double average = (double)total / 4;
    
    // 输出结果
    cout << "四门课总分: " << total << endl;
    cout << "平均分: " << average << endl;
    
    return 0;
}

运行结果:

四门课总分: 343
平均分: 85.75

8. 更贴近生活的例子:统计零花钱

假设你每天存一点零花钱到存钱罐里,连续一周。用数组记录每天的存钱数,然后算出一周总存钱数和平均每天存多少。

#include <iostream>
using namespace std;

int main() {
    // 一周7天的零花钱(单位:元)
    double saving[7] = {5.0, 3.5, 0.0, 10.0, 2.0, 8.0, 6.5};
    
    // 计算总和
    double total = 0;
    for (int day = 0; day < 7; day++) {
        total = total + saving[day];
    }
    
    cout << "一周总共存了: " << total << " 元" << endl;
    cout << "平均每天存: " << total / 7 << " 元" << endl;
    
    return 0;
}

运行结果:

一周总共存了: 35 元
平均每天存: 5 元

9. 相关知识点指引

学会了 一维数组,你已经能解决很多需要批量处理相同类型数据的问题了。接下来你可以学习:

  • 二维数组:就像教室里的座位,有行和列,可以用来存储矩阵、游戏地图等。
  • 数组的排序(如冒泡排序):对数组里的数据按大小排好队。
  • 字符数组和字符串:用 char 数组存储一串文字。
  • C++ 的 vector:一种更灵活的动态数组,大小可以改变,未来会经常用到。
  • 数组作为函数参数:把数组传给函数进行操作。

记住:数组是C++里最基础也最重要的数据结构,熟练掌握它,后面的学习会更加轻松。现在,去试试自己定义几个数组,存一存自己的零花钱、考试成绩或者游戏分数吧!

例题精讲

1单选题

在C++中,以下哪个数组定义是正确的?

Aint arr[5];
Bint arr[];
Cint[5] arr;
Darr int[5];
2单选题

已知 int a[10]; 则下列哪个下标访问是合法的?

Aa[10]
Ba[0]
Ca[-1]
Da[11]
3判断题

在C++中,执行 int a[5] = {1,2,3}; 后,数组a的所有元素都被正确初始化了。

4填空题
以下程序输出数组中所有元素的值,请补全代码。

#include <iostream>
using namespace std;
int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    for (int i = 0; i < 5; i++) {
        cout << ___ << " ";
    }
    return 0;
}
5填空题
以下程序计算数组元素之和,请补全代码。

#include <iostream>
using namespace std;
int main() {
    int score[4] = {85, 90, 78, 92};
    int sum = 0;
    for (int i = 0; i < 4; i++) {
        ___;
    }
    cout << sum;
    return 0;
}