目录
数组
1. 数组的定义语法
2. 数组的访问与赋值
访问语法
赋值语法
3. 数组的遍历
4. 使用数组时的注意事项
枚举
1. 枚举的定义语法
2. 枚举的定义变量与使用
3. 枚举的应用
4. 使用枚举时的注意事项
结尾
同志们,我又来辣!今天给大家分享的是数组和枚举。有没有感觉眼熟,这个正是第3篇讲数据类型时说过的复合数据类型:数、指、引、构、共、类、枚,7种类型里面的数和枚,话不多说,直接开整!
数组
在编程中,我们经常需要「批量处理相同类型的数据」:比如存储一个班级 50 个学生的成绩、记录 10 次实验的测量结果、保存一组商品的价格。如果为每个数据单独定义变量(比如score1、score2…score50),代码会又长又乱,还容易出错。
而数组就是为解决这个问题而生的核心语法 —— 它能让你用一个 “容器”,批量存储多个相同类型的数据,通过简单的 “编号” 就能快速访问、修改其中的任意数据。
数组就像一个「同类型数据的收纳盒」:
- 收纳盒里的每个格子大小一致,只能装相同类型的数据(比如全是整数、全是字符串,不能混着装);
- 每个格子有唯一的 “编号”(专业叫「下标」),通过编号能精准找到对应格子里的数据;
- 收纳盒的大小(能装多少数据)在创建时就固定了,不能随便扩容或缩容。
例如:
- 一个能装 5 个苹果的盒子,按 “第 1 格、第 2 格… 第 5 格” 存放苹果,想拿第 3 个苹果,直接找 “第 3 格” 就行 → 对应数组的 “下标访问”;
- 班级 50 个学生的成绩,不用定义 50 个变量,只用一个scores[50]数组就能装下所有成绩,简洁又高效。
注:
- 数据类型统一:数组里所有元素的类型必须完全一致,比如不能在 int 数组里装字符串、在 double 数组里装整数;
- 长度固定:数组创建时指定的 “能装的元素个数”(长度),定义后无法修改;
- 下标从 0 开始:这是最容易踩坑的点!数组的第一个元素下标是 0,第二个是 1,… 第 n 个元素的下标是n-1(比如长度为 5 的数组,下标范围是 0~4)。
1. 数组的定义语法
写法 1:定义 + 指定长度
语法:数据类型 数组名[数组长度];
// 语法:数据类型 数组名[数组长度];
int scores[5]; // 定义一个能装5个整数的数组
double prices[10]; // 定义一个能装10个小数的数组
string names[8]; // 定义一个能装8个字符串的数组
注:这种写法只定义了数组,但未初始化,数组里的元素会是随机的垃圾值,建议搭配初始化使用。
写法 2:定义 + 初始化
语法:数据类型 数组名[数组长度] = {值1, 值2, …, 值n};
// 语法:数据类型 数组名[数组长度] = {值1, 值2, …, 值n};
int scores[5] = {85, 92, 78}; // 初始化前3个元素,剩下的自动为0
double prices[3] = {9.9, 19.9, 29.9}; // 初始化所有元素
注:初始化的值个数不能超过数组长度,少于长度时,未初始化的元素自动为对应类型的默认值(int 默认 0、double 默认 0.0、string 默认空字符串)。
写法 3:省略长度(由初始化值个数决定)
语法:数据类型 数组名[] = {值1, 值2, …, 值n};
// 语法:数据类型 数组名[] = {值1, 值2, …, 值n};
int scores[] = {85, 92, 78, 90, 88}; // 数组长度自动为5
string names[] = {"张三", "李四", "王五"}; // 数组长度自动为3
2. 数组的访问与赋值
访问语法
使用:数组名 [下标],就能访问对应位置的元素,比如scores[0]是第一个元素,scores[4]是第五个元素。
一定要记住:下标从 0 开始,数组的第一个元素下标是 0。
赋值语法
使用:数组名 [下标] = 值,比如scores[2] = 80,就能修改第三个元素的值。
#include <iostream>
using namespace std;
int main() {
// 定义并初始化数组:存储5个学生的成绩
int scores[5] = {85, 92, 78, 90, 88};
// 访问第一个元素(下标0)
cout << "第一个学生的成绩:" << scores[0] << endl;
// 修改第三个元素(下标2)
scores[2] = 80;
cout << "修改后第三个学生的成绩:" << scores[2] << endl;
// 访问第五个元素(下标4)
cout << "第五个学生的成绩:" << scores[4] << endl;
return 0;
}
3. 数组的遍历
遍历就是「逐个访问数组的所有元素」,是数组最常用的操作,搭配 for 循环使用最方便。
案例 1:遍历数组,打印所有成绩
#include <iostream>
using namespace std;
int main() {
int scores[5] = {85, 92, 78, 90, 88};
int len = 5; // 数组长度
// for循环遍历:下标从0到len-1
for (int i = 0; i < len; i++) {
cout << "第" << i+1 << "个学生成绩:" << scores[i] << endl;
}
return 0;
}
输出:
第1个学生成绩:85
第2个学生成绩:92
第3个学生成绩:78
第4个学生成绩:90
第5个学生成绩:88
案例 2:遍历数组,计算总分和平均分
#include <iostream>
using namespace std;
int main() {
int scores[5] = {85, 92, 78, 90, 88};
int len = 5;
int sum = 0; // 总分
// 累加总分
for (int i = 0; i < len; i++) {
sum += scores[i];
}
// 计算平均分:转成浮点型避免整数除法
double avg = sum / (double)len;
cout << "班级总分:" << sum << endl;
cout << "班级平均分:" << avg << endl;
return 0;
}
输出:
班级总分:433
班级平均分:86.6
4. 使用数组时的注意事项
1:下标越界
数组长度为 5,下标范围是 0~4,若访问scores[5]就是 “下标越界”—— 会访问到内存中不属于数组的区域,导致程序崩溃、数据错乱,甚至安全问题。
// 错误写法:scores[5]下标越界(长度5,最大下标4)
int scores[5] = {85,92,78,90,88};
cout << scores[5];
// 正确写法:严格控制下标范围0~len-1
for(int i=0; i<5; i++) {
cout << scores[i];
}
2:定义数组后修改长度
数组的长度是 “静态” 的,创建后不能修改,想动态调整长度需使用 vector(后期学STL容器时再将)。
// 错误写法:试图修改数组长度,编译报错
int scores[5];
scores[6]; // 编译器直接报错
// 正确写法:创建时确定长度,或后期学vector
3:初始化值个数超过数组长度
初始化数组时,值的个数不能超过数组定义的长度,否则编译器直接报错。
// 错误写法:长度5,却初始化6个值
int scores[5] = {85,92,78,90,88,95}; // 编译报错
// 正确写法:初始化值个数≤数组长度
int scores[5] = {85,92,78}; // 剩下2个元素自动为0
枚举
在编程中,我们经常需要「定义一组固定范围的常量」:比如表示一周的 7 天、标记订单的 “待支付 / 已支付 / 已取消” 状态、区分商品的 “热销 / 新品 / 下架” 类型。
如果直接用数字(1 代表周一、2 代表周二,0 代表待支付、1 代表已支付),代码里全是 “数字”—— 别人看代码时根本不知道这些数字的含义,自己后期维护也容易搞混。
而枚举(enum) 就是解决这个问题的核心语法 —— 它能给一组固定的数字常量起 “有意义的名字”,让代码从 “一堆看不懂的数字” 变成 “直观的语义化代码”,可读性和可维护性翻倍。
枚举(enum)本质是「给一组固定的整数常量起个好记的名字」:
- 比如用Monday代替数字 0、Tuesday代替数字 1 表示星期,不用再记 “0 = 周一、1 = 周二”;
- 比如用Pending代替数字 0、Paid代替数字 1 表示订单状态,看到Paid就知道是 “已支付”,不用猜数字含义;
- 枚举里的每个名字(比如Monday、Pending)都是常量,值不能修改,且只能是整数。
举例:
- 把 “红灯 = 0、黄灯 = 1、绿灯 = 2” 定义成枚举,写RedLight比写 0 更直观;
- 把 “男 = 1、女 = 2、未知 = 0” 定义成枚举,写Male比写 1 更易理解。
注:
- 枚举是常量集合:枚举里的每个 “名字” 都是整数常量,定义后不能修改其值;
- 默认编号规则:枚举常量默认从 0 开始编号,依次递增 1(比如第一个常量是 0,第二个是 1,第三个是 2…);
- 可自定义值:可以手动指定枚举常量的数值,打破默认规则(比如Pending=0、Paid=10);
- 命名:枚举的核心价值是 “见名知意”,命名要贴合实际含义(比如OrderStatus表示订单状态,Week表示星期)。
1. 枚举的定义语法
基本语法
// 语法:enum 枚举名 { 常量1, 常量2, …, 常量n };
enum 枚举名 {
枚举常量1, // 默认值0
枚举常量2, // 默认值1
枚举常量3 // 默认值2
};
写法 1:默认值枚举
// 定义星期枚举:默认Monday=0,Tuesday=1…Sunday=6
enum Week {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
// 定义订单状态枚举:默认Pending=0,Paid=1,Cancelled=2
enum OrderStatus {
Pending, // 待支付
Paid, // 已支付
Cancelled // 已取消
};
写法 2:自定义值枚举
// 自定义订单状态值:Pending=0,Paid=1,Cancelled=5(跳过2-4)
enum OrderStatus {
Pending = 0,
Paid = 1,
Cancelled = 5
};
// 自定义性别枚举:Male=1,Female=2,Unknown=0
enum Gender {
Unknown = 0,
Male = 1,
Female = 2
};
注:自定义值可以是任意整数,无需连续,但建议按逻辑编号
2. 枚举的定义变量与使用
定义枚举变量
枚举变量只能存储该枚举的常量值,语法和普通变量一致:
// 语法:枚举名 变量名 = 枚举常量;
OrderStatus status = Paid; // 状态为已支付
Week today = Wednesday; // 今天是周三
Gender gender = Female; // 性别为女
#include <iostream>
using namespace std;
// 定义订单状态枚举
enum OrderStatus {
Pending = 0, // 待支付
Paid = 1, // 已支付
Cancelled = 2 // 已取消
};
int main() {
// 定义枚举变量
OrderStatus order1 = Paid;
OrderStatus order2 = Pending;
// 1. 直接使用枚举变量(判断状态)
if (order1 == Paid) {
cout << "订单1:已支付,等待发货!" << endl;
}
if (order2 == Pending) {
cout << "订单2:待支付,请尽快付款!" << endl;
}
// 2. 枚举常量本质是整数,可输出其数值
cout << "Pending的数值:" << Pending << endl;
cout << "Cancelled的数值:" << Cancelled << endl;
return 0;
}
输出结果:
订单1:已支付,等待发货!
订单2:待支付,请尽快付款!
Pending的数值:0
Cancelled的数值:2
3. 枚举的应用
枚举的常量是固定值,和 switch 的 “等值匹配” 完美适配,代码可读性远超直接用数字判断。
案例:用 switch 判断订单状态
#include <iostream>
using namespace std;
enum OrderStatus {
Pending = 0,
Paid = 1,
Cancelled = 2
};
int main() {
OrderStatus status = Cancelled;
switch (status) {
case Pending:
cout << "订单状态:待支付,超时将自动取消!" << endl;
break;
case Paid:
cout << "订单状态:已支付,预计24小时内发货!" << endl;
break;
case Cancelled:
cout << "订单状态:已取消,如有疑问请联系客服!" << endl;
break;
default:
cout << "订单状态:无效!" << endl;
break;
}
return 0;
}
4. 使用枚举时的注意事项
1:修改枚举常量的值
枚举常量是 “只读常量”,定义后不能修改其值,否则编译器直接报错。
enum OrderStatus { Pending=0, Paid=1 };
Pending = 5; // 错误:枚举常量不能赋值,编译报错
2:枚举常量重名
不同枚举的常量名不能重复,否则编译器无法区分,直接报错。
// 错误写法:两个枚举都有Monday,编译报错
enum Week { Monday, Tuesday };
enum Day { Monday, Wednesday };
// 正确写法:命名区分开
enum Week { Week_Monday, Week_Tuesday };
enum Day { Day_Monday, Day_Wednesday };
3:直接输出枚举常量的名字
枚举常量本质是整数,直接输出会显示数值,而非我们定义的名字(比如输出Pending显示 0,不是 “Pending”)。
OrderStatus status = Pending;
cout << status; // 输出0,不是“Pending”
// 解决方法:手动用if/switch映射成字符串
if (status == Pending) {
cout << "Pending";
} else if (status == Paid) {
cout << "Paid";
}
4:枚举变量赋值非枚举常量
枚举变量只能存储该枚举定义的常量值,不能直接赋值普通整数,否则编译器报错。
enum OrderStatus { Pending=0, Paid=1 };
OrderStatus status = 2; // 错误:不能直接赋值整数,编译报错
// 正确写法:只能赋值枚举常量
OrderStatus status = Cancelled;
结尾
OK,这就是C++学习路线其一:入门篇的第七篇文章,让大家学习了复合数据类型中的数组和枚举,以及他们的操作和具体使用时的注意事项。
对于我的每篇文章,我都会将我的学习路线放在结尾,目前进度为:第一阶段 C++基本语法入门篇的第七篇。
同志们,下一篇文章再见,我尽量会保持一周写三篇文章,记录我的学习过程,对于C++的学习我打算按照下面的路线去学,大家有比我学的快的也可以按照我的路线去看看自己接下来学什么。
网课推荐:黑马程序员,同时给大家推荐一位大佬,b站搜索“恋恋风辰zack”,这个大佬的视频也是我一直在跟着学习的,讲的很好。
学习路线:主攻高性能开发,如果大家像学习游戏引擎或嵌入式,可以自己设计一下学习路线
第一阶段: C++基本语法,Git入门
第二阶段:熟练STL,类,智能指针,模板,函数绑定等等
第三阶段:Linux基础,多线程, 网络编程,设计模式
第四阶段:gRPC,MySQL,Redis,JS,QT,消息队列,手写各种池子(线程池、内存池)
第五阶段:进军高性能方向,开始学习 一致性哈希,分布式锁,Raft算法,网络优化、内存优化、并发优化
第六阶段:真正实现工业级项目,在每一阶段的学习过程中都要写一些练手的小项目,可以在GitHub上找一下,积少成多,最终可以实现工业级项目
网硕互联帮助中心



评论前必须登录!
注册