数组(array)用于保存一组有顺序、类型相同的数据。每个元素都通过下标访问,数组的长度在创建时确定。
创建数组
数组字面量适合已经知道元素的情况;int counts[4]{} 会创建并清零 4 个格子。数组类型写在变量名前面,方括号说明“这是一组该类型的数据”。
int main() {
int scores[] = {88, 91, 76, 95, 83};
int counts[4]{};
counts[0] = 12;
counts[1] = 9;
return 0;
}使用 {} 初始化数值数组时,所有元素都会变为 0;未初始化的局部数组不会自动获得默认值。数组的格子数由创建时决定。
知识测验
题目
int counts[4]{} 执行后,四个元素的值是什么?
访问数组元素
数组下标(index)从 0 开始,所以第一个元素是 scores[0]。长度为 5 的数组,合法下标是 0、1、2、3、4;访问 scores[5] 会产生未定义行为。
#include <iostream>
using namespace std;
int main() {
int scores[] = {88, 91, 76, 95, 83};
cout << scores[0] << endl; // 88
cout << scores[4] << endl; // 83
scores[2] = 80;
cout << scores[2] << endl; // 80
return 0;
}互动实验
数组索引探照灯
访问权限免费
点击任意格子,让 C++ 表达式准确指向一个元素。观察合法下标始终是 0 到 score_count-1。
知识测验
题目
int scores[] = {88, 91, 76}; 时,scores[2] 是多少?
数组长度与循环
内置数组没有 length 字段。本例先计算 score_count = 5;最后一个合法下标是 score_count - 1。
#include <iostream>
using namespace std;
int main() {
int scores[] = {88, 91, 76, 95, 83};
const int score_count = 5;
for (int i = 0; i < score_count; i++) {
cout << "scores[" << i << "] = " << scores[i] << endl;
}
for (int score : scores) {
cout << score << endl;
}
return 0;
}知识测验
题目
遍历整个数组时,哪个条件不会越界?
固定长度与常用操作
数组可以改写已有元素,也可以通过循环查找内容;这些操作都不会增加或删除格子。
#include <iostream>
using namespace std;
int main() {
int values[] = {4, 0, 7, 0, 2, 9};
values[2] = 5;
for (int value : values) {
cout << value << ' ';
}
return 0;
}知识测验
题目
关于 C++ 数组,哪一句正确?
动手练习
把数组中的 0 移到末尾
给定数组 {0, 1, 0, 3, 12},保持非零元素的相对顺序,把所有 0 原地移动到末尾。
- 使用 read 下标扫描每个元素。
- 使用 write 下标记录下一个非零元素应写入的位置。
- 扫描结束后,将 write 到数组末尾的格子全部补为 0。
动手练习
原地反转整数数组
使用两个下标 left 和 right,从数组两端向中间移动并交换元素。输入 {2, 4, 6, 8, 10},输出 {10, 8, 6, 4, 2}。
- 设置 left 指向首元素、right 指向末元素。
- 交换两端元素后同时向中间移动。
- 当 left 不再小于 right 时停止,并输出数组。