📚 什么是数组?
从变量到数组
之前我们学习过变量,一个变量只能存储一个数据。但如果要存储多个相同类型的数据怎么办?
int score1 = 85;
int score2 = 92;
int score3 = 78;
int score4 = 95;
int score5 = 88;
💡 数组的优势:
• 一个名字管理多个数据
• 可以通过索引访问任意元素
• 可以用循环批量处理
• 内存连续,访问速度快
数组的定义
数组(Array)是一种数据结构,用于存储相同类型的多个数据。
- ✅ 相同类型:所有元素必须是同一数据类型
- ✅ 连续存储:在内存中连续存放
- ✅ 固定大小:创建后大小不能改变
- ✅ 索引访问:通过下标(从0开始)访问元素
scores[5] 数组可视化
生活中的数组类比
数组就像生活中的很多场景:
- 🏫 教室座位:一排座位,每个座位有编号(0, 1, 2...)
- 📮 邮箱格子:一排邮箱,每个格子有号码
- 🎫 电影票座位:一排座位号(第1排第1座、第1排第2座...)
- 📊 Excel表格一行:一行中的多个单元格
🎯 关键理解:
• 数组名 = 整排的名字(如"第一排")
• 索引 = 座位号(从0开始编号)
• 元素 = 座位上的人或物品
• 类型 = 所有人的类型必须相同(都是学生)
⚙️ 数组的声明和初始化
声明数组的语法
#include <iostream>
using namespace std;
int main() {
int scores[5];
int ages[3] = {18, 20, 22};
double prices[] = {9.9, 19.9, 29.9};
int zeros[5] = {0};
return 0;
}
💡 语法规则:
• 格式:类型 数组名[大小];
• 大小必须是常量或常量表达式
• 索引从0开始,到大小-1结束
• 未初始化的元素值是随机的
访问数组元素
#include <iostream>
using namespace std;
int main() {
int scores[5] = {85, 92, 78, 95, 88};
cout << "第1个成绩:" << scores[0] << endl;
cout << "第3个成绩:" << scores[2] << endl;
cout << "最后1个成绩:" << scores[4] << endl;
scores[1] = 96;
cout << "修改后:" << scores[1] << endl;
return 0;
}
⚠️ 重要提醒:
• 索引从0开始,不是从1开始!
• 最大索引是大小-1
• 访问越界会导致程序崩溃或错误结果
• C++不会自动检查数组越界
🎮 互动实验:数组可视化
输入5个数字,直观看到数组的存储结构
输入数字后点击"可视化"...
🛠️ 数组的遍历和操作
使用for循环遍历数组
#include <iostream>
using namespace std;
int main() {
int scores[5] = {85, 92, 78, 95, 88};
cout << "所有成绩:";
for (int i = 0; i < 5; i++) {
cout << scores[i] << " ";
}
cout << endl;
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += scores[i];
}
double average = (double)sum / 5;
cout << "总分:" << sum << endl;
cout << "平均分:" << average << endl;
return 0;
}
查找最大值和最小值
#include <iostream>
using namespace std;
int main() {
int scores[5] = {85, 92, 78, 95, 88};
int maxScore = scores[0];
int minScore = scores[0];
for (int i = 1; i < 5; i++) {
if (scores[i] > maxScore) {
maxScore = scores[i];
}
if (scores[i] < minScore) {
minScore = scores[i];
}
}
cout << "最高分:" << maxScore << endl;
cout << "最低分:" << minScore << endl;
return 0;
}
数组的实际应用场景
数组在生活中无处不在:
- 📊 成绩管理:存储全班同学的成绩
- 🌡️ 温度记录:记录一周每天的温度
- 💰 销售数据:存储每个月的销售额
- 🎮 游戏开发:存储玩家的生命值、道具等
- 📱 通讯录:存储联系人信息
🎯 数组统计器
输入一组数字,自动计算统计数据
输入数字后点击"统计"...
🚀 数组的高级知识
数组在内存中的存储
#include <iostream>
using namespace std;
int main() {
int arr[5] = {10, 20, 30, 40, 50};
cout << "数组首地址:" << &arr << endl;
cout << "第1个元素地址:" << &arr[0] << endl;
cout << "第2个元素地址:" << &arr[1] << endl;
cout << "数组总大小:" << sizeof(arr) << " 字节" << endl;
cout << "单个元素大小:" << sizeof(arr[0]) << " 字节" << endl;
cout << "元素个数:" << sizeof(arr) / sizeof(arr[0]) << endl;
return 0;
}
💡 内存特点:
• 数组元素在内存中连续存储
• 相邻元素地址相差一个元素的大小
• int类型占4字节,所以地址相差4
• 可以通过指针高效访问
数组的局限性
虽然数组很有用,但也有一些限制:
- ❌ 固定大小:创建后不能改变大小
- ❌ 相同类型:只能存储一种数据类型
- ❌ 插入删除困难:需要在中间插入或删除元素时效率低
- ❌ 越界危险:C++不检查数组越界,容易出错
- ✅ 解决方案:后续学习vector(动态数组)
常见错误和注意事项
int n;
cin >> n;
int arr[n];
const int SIZE = 10;
int arr[SIZE];
int arr[5];
arr[5] = 100;
int arr1[5] = {1, 2, 3, 4, 5};
int arr2[5];
arr2 = arr1;
for (int i = 0; i < 5; i++) {
arr2[i] = arr1[i];
}
📝 实战练习
📝 小练习:数组理解
以下代码的输出是什么?
#include <iostream>
using namespace std;
int main() {
int arr[5] = {10, 20, 30, 40, 50};
cout << arr[0] + arr[4] << endl;
return 0;
}
选择答案查看解析...
💻 编程挑战
题目:创建一个程序,输入n个学生的成绩,然后输出最高分、最低分和平均分。
输入人数后点击"生成代码"...