C++数组的遍历与操作
困难26用循环把数组里的每个元素都“点名”一遍——C++数组遍历与操作
什么是数组遍历?
“遍历”这个词听起来有点专业,其实意思非常简单:把数组里每个元素从头到尾都访问一次。就像老师上课点名,一个一个叫到名字;或者像排队买零食,收银员从第一个同学看到最后一个同学。在编程里,我们常常需要对所有元素做同一件事,比如打印所有分数、把所有成绩加10分,或者找出最高分。这时候就要用到遍历。
C++里最常用的遍历工具是 for 循环。循环变量从0开始,每次增加1,一直走到数组最后一个元素的位置(长度减1)。通过 数组名[循环变量] 就能拿到当前这个元素。
用 for 循环遍历数组——点名套路
假设有一个数组 score 存了5位同学的数学分数,我们要把所有分数打印在屏幕上。遍历的套路长这样:
for(int i=0; i<5; i++) {
cout << score[i] << " ";
}
int i=0:从第0个位置开始(第一个同学)i<5:只要还没到第5个位置(最后一个同学的位置是4),就继续i++:每次向后移动一位score[i]:拿到当前这个位置的分数
生活中的例子:你手里有5张零食兑换券,编号从0到4。你要一张一张地查看每张券能换什么零食,这就是遍历。
怎么知道数组有多长?
上面例子直接写了数字 5,但如果数组长度变了,代码就得改。更灵活的做法是让程序自动算长度。
C++中可以用 sizeof 运算符求出整个数组占了多少字节,再用一个元素占的字节数一除,就得到元素个数:
int len = sizeof(数组名) / sizeof(数组名[0]);
例如:
int num[4] = {5, 8, 2, 10};
int len = sizeof(num) / sizeof(num[0]); // len = 16 / 4 = 4
这样即使以后把数组改成6个数,len 也会自动变成6,不用手动改循环条件。
⚠️ 注意:
sizeof只有在数组定义所在的作用域内才能正确算出长度。如果数组作为参数传给了函数,在函数里sizeof只会得到指针的大小,结果就不对了。后面学函数时会专门讲这点。
遍历时可以做哪些操作?
1. 修改每个元素的值
比如全班考试考砸了,老师要给每个人的分数加10分作为安慰分。遍历数组,对每个元素执行 num[i] = num[i] + 10 或者简写 num[i] += 10。
for(int i=0; i<len; i++) {
num[i] += 10; // 每个分数加10
}
2. 累加求和(算总分)
想象你要统计全班同学的总零花钱,或者求所有考试成绩的总分。用一个变量 sum 从0开始,每次循环把当前元素加上去。
int sum = 0;
for(int i=0; i<len; i++) {
sum = sum + num[i]; // 或者 sum += num[i];
}
cout << "总分 = " << sum << endl;
3. 找最大值 / 最小值
比如你想知道这次考试全班最高分是多少。先假设第一个元素是最大值,然后遍历剩下的元素,如果遇到更大的就更新。
int max_val = num[0]; // 假设第一个最大
for(int i=1; i<len; i++) { // 从第二个开始比较
if(num[i] > max_val) {
max_val = num[i]; // 发现更大的,更新
}
}
cout << "最高分 = " << max_val << endl;
注意循环从 i=1 开始,因为已经拿第一个当基准了。
新手最容易犯的4个错误
❌ 错误1:数组越界——访问了不存在的元素
int arr[5] = {1,2,3,4,5};
for(int i=0; i<=5; i++) { // 条件写成 i<=5,当i=5时访问arr[5]——越界!
cout << arr[i];
}
数组下标从0到4,arr[5] 是第6个元素,根本不存在。程序可能不报错,但会输出一个奇怪的值,甚至导致崩溃。
正确写法:循环条件用 i < 长度,不要用 <=。
❌ 错误2:把数组索引从1开始数
很多人受日常生活影响,数东西从1开始。但数组索引必须从0开始。如果写 for(int i=1; i<=len; i++),第一个元素 arr[0] 就被漏掉了,还会访问越界的 arr[len]。
❌ 错误3:忘记初始化数组元素
定义数组时如果不给初始值,里面的数是随机的(全局数组除外)。做求和、比大小前要确保数组里有确定的值。
int arr[5]; // 里面是垃圾值
arr[0] = 10; // 只赋了一个
// 其他4个仍然是垃圾值
最佳做法:定义时直接初始化,比如 int arr[5] = {0}; 把所有元素设为0。
❌ 错误4:用 sizeof 求函数参数中数组的长度
这是后面才会遇到的坑,但提前提一下:
void printArray(int arr[]) { // 这里的arr其实是个指针
int len = sizeof(arr) / sizeof(arr[0]); // 错!sizeof(arr)是指针大小(8或4),不是整个数组
}
解决办法:把长度作为第二个参数传进来,或者用C++17的 std::size(需要包含 <iterator>),不过初学者先用简单方法:在main函数里计算好长度再传。
完整示例:统计全班考试成绩并找出最高分
下面代码模拟一次小测验:数组里存了6个同学的分数,先打印原始成绩,然后计算总分和平均分,再找出最高分。
#include <iostream>
using namespace std;
int main() {
// 定义数组,存6个同学的考试成绩
int score[6] = {78, 92, 85, 63, 88, 70};
int len = sizeof(score) / sizeof(score[0]); // 自动计算长度为6
// 1. 遍历输出原始成绩
cout << "原始成绩: ";
for(int i=0; i<len; i++) {
cout << score[i] << " ";
}
cout << endl;
// 2. 遍历计算总分
int total = 0; // 总分,初始为0
for(int i=0; i<len; i++) {
total = total + score[i]; // 累加每个分数
}
double average = (double)total / len; // 平均分,强制转成小数
cout << "总分: " << total << ",平均分: " << average << endl;
// 3. 遍历查找最高分
int max_score = score[0]; // 先假设第一个分数最高
for(int i=1; i<len; i++) { // 从第二个开始比较
if(score[i] > max_score) {
max_score = score[i];
}
}
cout << "最高分: " << max_score << endl;
// 4. 把所有分数加5分(老师给每个同学加5分鼓励)
cout << "加5分后的成绩: ";
for(int i=0; i<len; i++) {
score[i] += 5; // 等价于 score[i] = score[i] + 5;
cout << score[i] << " ";
}
cout << endl;
return 0;
}
运行结果:
原始成绩: 78 92 85 63 88 70
总分: 476,平均分: 79.3333
最高分: 92
加5分后的成绩: 83 97 90 68 93 75
相关知识点看这里
- 学完一维数组的遍历,接下来可以学二维数组(比如成绩表里既有行又有列),遍历时用两层循环。
- C++11以后支持范围
for循环(for(int x : arr)),写起来更简洁,但有时候不能直接修改元素(除非用引用)。 - 如果需要动态改变数组大小,可以学习**
vector容器**,它自带size()函数,不用自己算长度。 - 数组作为函数参数时如何传递长度——这是很多初学函数的人会碰到的坑,提前了解一下。
遍历是数组操作的基础,就像学骑自行车要先学会蹬脚踏板一样。多写几个遍历的小程序(比如统计全班零花钱总和、找出最便宜的零食价格),就会越用越熟练!
例题精讲
下列代码执行后,数组a中所有元素的值是? int a[5] = {1,2,3,4,5}; for(int i=0; i<5; i++) { a[i] = a[i] + 1; }
以下代码运行后,程序可能发生的情况是? int arr[3] = {10,20,30}; for(int i=1; i<=3; i++) { cout << arr[i] << " "; }
使用for循环遍历数组时,循环变量可以从1开始,只要保证不访问到越界元素。例如:int arr[5]; for(int i=1; i<=5; i++) arr[i]=i; 是正确的。
对数组中的所有元素进行相同的操作(例如每个元素乘以2)时,必须使用循环语句,无法用其他方式实现。
补全以下程序,使其能计算数组arr中所有元素的总和并输出。
#include <iostream>
using namespace std;
int main() {
int arr[5] = {2,4,6,8,10};
int sum = 0;
for(int i=0; i<5; i++) {
___
}
cout << sum << endl;
return 0;
}