C++一维数组的定义与使用
中等30一排带编号的储物柜——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个元素 |
| 所有元素赋0 | int 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++里最基础也最重要的数据结构,熟练掌握它,后面的学习会更加轻松。现在,去试试自己定义几个数组,存一存自己的零花钱、考试成绩或者游戏分数吧!
例题精讲
在C++中,以下哪个数组定义是正确的?
已知 int a[10]; 则下列哪个下标访问是合法的?
在C++中,执行 int a[5] = {1,2,3}; 后,数组a的所有元素都被正确初始化了。
以下程序输出数组中所有元素的值,请补全代码。
#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;
}以下程序计算数组元素之和,请补全代码。
#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;
}