📚 C++一维数组笔记
一、什么是数组?🤔
1.1 生活中的数组
想象一下,你有一个带编号的储物柜:
- 柜子编号:1号、2号、3号...直到100号
- 每个柜子里可以放不同的东西
- 通过编号可以快速找到对应的柜子
数组就是编程中的"储物柜"!
数组是 C++ 中最常用的数据结构。它用一段连续内存存储相同类型的多个元素,让我们能高效地批量处理数据。

为什么需要数组?

1.2 数组的定义
cpp
// 语法格式:类型 数组名[元素个数];
int scores[5]; // 定义一个能存放5个整数的数组
重要概念:
- 数组名:就像储物柜的"名字"(比如scores)
- 下标:从0开始的编号(0,1,2,3,4)
- 元素:每个柜子里存放的数据
1.3 数组的"下标"为什么从0开始?
小故事:计算机科学家们发现,从0开始计算位置,在底层实现时更高效。就像我们数楼层,中国从1楼开始,但有些国家从0楼(Ground Floor)开始。
二、数组的基本操作 🛠️
2.1 声明和初始化
cpp
// 方法1:声明后逐个赋值
int a[5];
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;
a[4] = 50;
// 方法2:声明时直接初始化
int b[5] = {10, 20, 30, 40, 50};
// 方法3:部分初始化(其余自动为0)
int c[5] = {1, 2, 3}; // c[3]=0, c[4]=0
// 方法4:不指定大小(根据初始化值自动确定)
int d[] = {1, 2, 3, 4, 5}; // 自动成为5个元素
2.2 访问数组元素
cpp
int arr[3] = {100, 200, 300};
// 通过下标访问
cout << arr[0]; // 输出:100
cout << arr[1]; // 输出:200
cout << arr[2]; // 输出:300
// 修改元素
arr[1] = 250; // 现在数组为:{100, 250, 300}
2.3 使用循环遍历数组
cpp
int scores[5] = {85, 92, 78, 90, 88};
// 正向遍历(从第0个到第4个)
for(int i = 0; i < 5; i++) {
cout << "第" << i+1 << "个成绩是:" << scores[i] << endl;
}
// 反向遍历(从第4个到第0个)
for(int i = 4; i >= 0; i--) {
cout << scores[i] << " ";
}
三、数组的常见应用场景 🎯
3.1 求最大值和最小值
cpp
int arr[5] = {23, 45, 12, 67, 34};
int max_val = arr[0]; // 假设第一个最大
int min_val = arr[0]; // 假设第一个最小
for(int i = 1; i < 5; i++) {
if(arr[i] > max_val) max_val = arr[i];
if(arr[i] < min_val) min_val = arr[i];
}
cout << "最大值:" << max_val << endl;
cout << "最小值:" << min_val << endl;
3.2 求和与平均值
cpp
int scores[5] = {85, 92, 78, 90, 88};
int sum = 0;
for(int i = 0; i < 5; i++) {
sum += scores[i]; // 累加每个成绩
}
double average = (double)sum / 5;
cout << "总分:" << sum << endl;
cout << "平均分:" << average << endl;
3.3 统计特定值的个数
cpp
int arr[10] = {1, 2, 3, 2, 4, 2, 5, 2, 6, 7};
int target = 2;
int count = 0;
for(int i = 0; i < 10; i++) {
if(arr[i] == target) {
count++;
}
}
cout << "数字" << target << "出现了" << count << "次" << endl;
四、数组的常见错误 ⚠️
4.1 数组越界(最危险的错误!)
cpp
int arr[5] = {1, 2, 3, 4, 5};
// ❌ 错误:下标超出范围
arr[5] = 100; // 数组只有0-4,没有第5个!
// ✅ 正确写法
arr[4] = 100; // 修改最后一个元素
记忆口诀:数组下标从0起,最大下标是n-1,越界访问很危险,程序崩溃找bug!
4.2 未初始化就使用
cpp
int arr[5];
// ❌ 错误:arr[0]的值不确定(可能是垃圾值)
cout << arr[0];
// ✅ 正确:先初始化再使用
int arr[5] = {0}; // 全部初始化为0
4.3 忘记数组大小
cpp
// ❌ 错误:忘记定义数组大小
int arr[]; // 编译错误!
// ✅ 正确:要么指定大小,要么初始化
int arr[100];
int arr[] = {1, 2, 3}; // 自动确定为3个元素
五、经典例题讲解 📝
例题1:陶陶摘苹果(洛谷P1046)
题目描述:陶陶有10个苹果,每个苹果有一定高度。陶陶身高加上板凳高度(30cm),能摘到哪些苹果?
cpp
#include <iostream>
using namespace std;
int main() {
int apples[10]; // 存储10个苹果的高度
int height; // 陶陶的身高
// 输入10个苹果的高度
for(int i = 0; i < 10; i++) {
cin >> apples[i];
}
// 输入陶陶的身高
cin >> height;
int total_height = height + 30; // 加上板凳高度
int count = 0; // 能摘到的苹果数
for(int i = 0; i < 10; i++) {
if(apples[i] <= total_height) {
count++;
}
}
cout << count << endl;
return 0;
}
例题2:数组元素的查找
题目:在数组中查找某个数,找到输出位置,找不到输出-1
cpp
#include <iostream>
using namespace std;
int main() {
int arr[10] = {5, 8, 2, 9, 1, 7, 3, 6, 4, 0};
int target;
cout << "请输入要查找的数字:";
cin >> target;
int position = -1; // 初始化为-1表示没找到
for(int i = 0; i < 10; i++) {
if(arr[i] == target) {
position = i; // 记录位置
break; // 找到就退出循环
}
}
if(position != -1) {
cout << "找到了!位置是:" << position << endl;
} else {
cout << "没找到这个数字" << endl;
}
return 0;
}
六、数组的进阶技巧 🚀
6.1 数组的"标记"用法
cpp
// 统计每个数字出现的次数
int arr[10] = {1, 2, 3, 2, 1, 3, 4, 5, 2, 1};
int count[6] = {0}; // 假设数字范围是1-5
for(int i = 0; i < 10; i++) {
count[arr[i]]++; // 对应数字的计数加1
}
// 输出每个数字出现的次数
for(int i = 1; i <= 5; i++) {
cout << "数字" << i << "出现" << count[i] << "次" << endl;
}
6.2 数组的"翻转"操作
cpp
int arr[5] = {1, 2, 3, 4, 5};
int n = 5;
// 翻转数组
for(int i = 0; i < n/2; i++) {
int temp = arr[i];
arr[i] = arr[n-1-i];
arr[n-1-i] = temp;
}
// 输出:5 4 3 2 1
for(int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
七、课后练习题 📝
基础题(必做)
- 数组求和:输入10个数,求它们的和
- 找最大值:输入8个数,找出最大值和它的位置
- 统计奇偶:输入6个数,统计奇数和偶数的个数
提高题(选做)
- 数组去重:输入10个数,去掉重复的数字
- 冒泡排序:用数组实现冒泡排序(从小到大)
挑战题(信奥风格)
- 校门外的树(洛谷P1047):一条路长L米,有M个区域要移走树,求最后剩下的树的数量
八、学习小贴士 💡
8.1 记忆口诀
数组就像储物柜,编号从零开始对
声明类型加中括号,元素个数要写对
下标范围要牢记,0到n-1别越界
循环遍历最常用,for循环来帮忙
8.2 常见问题解答
Q:为什么数组下标从0开始?
A:这是C/C++的传统,计算机内存地址从0开始编号,这样设计更高效。
Q:数组大小可以改变吗?
A:普通数组大小是固定的,不能改变。如果需要动态大小,可以学习vector。
Q:数组可以存不同类型的数据吗?
A:不行,一个数组只能存同一种类型的数据。
8.3 学习建议
- 多画图:在纸上画出数组的格子,理解下标和元素的关系
- 多调试:用cout输出中间结果,观察数组的变化
- 多练习:每天做2-3道数组练习题
九、总结 📌
数组三要素
- 类型:所有元素必须是同一类型
- 名称:给数组起个有意义的名字
- 大小:确定数组能存多少个元素
数组三操作
- 存数据:通过下标赋值
- 取数据:通过下标读取
- 遍历:用循环访问每个元素
数组三注意
- 下标从0开始
- 不要越界
- 使用前要初始化
寄语:数组是编程中最重要的数据结构之一,就像学数学要先学加减乘除一样,学好数组是成为编程高手的第一步!🌟