📦 C++ 初始数组 - L15 高级概念

了解数组的概念和作用,为什么需要数组这种数据结构

📚 什么是数组?

从变量到数组

之前我们学习过变量,一个变量只能存储一个数据。但如果要存储多个相同类型的数据怎么办?

// ❌ 用多个变量存储5个学生的成绩 int score1 = 85; int score2 = 92; int score3 = 78; int score4 = 95; int score5 = 88; // 问题: // 1. 变量名太多,管理困难 // 2. 如果有100个学生怎么办? // 3. 无法用循环批量处理
💡 数组的优势:
• 一个名字管理多个数据
• 可以通过索引访问任意元素
• 可以用循环批量处理
• 内存连续,访问速度快

数组的定义

数组(Array)是一种数据结构,用于存储相同类型的多个数据。

  • 相同类型:所有元素必须是同一数据类型
  • 连续存储:在内存中连续存放
  • 固定大小:创建后大小不能改变
  • 索引访问:通过下标(从0开始)访问元素
[0]
85
[1]
92
[2]
78
[3]
95
[4]
88

scores[5] 数组可视化

生活中的数组类比

数组就像生活中的很多场景:

  • 🏫 教室座位:一排座位,每个座位有编号(0, 1, 2...)
  • 📮 邮箱格子:一排邮箱,每个格子有号码
  • 🎫 电影票座位:一排座位号(第1排第1座、第1排第2座...)
  • 📊 Excel表格一行:一行中的多个单元格
🎯 关键理解:
• 数组名 = 整排的名字(如"第一排")
• 索引 = 座位号(从0开始编号)
• 元素 = 座位上的人或物品
• 类型 = 所有人的类型必须相同(都是学生)

⚙️ 数组的声明和初始化

声明数组的语法

#include <iostream> using namespace std; int main() { // 方法1:声明时指定大小 int scores[5]; // 声明一个可以存储5个整数的数组 // 方法2:声明并初始化 int ages[3] = {18, 20, 22}; // 方法3:自动推断大小 double prices[] = {9.9, 19.9, 29.9}; // 大小为3 // 方法4:全部初始化为0 int zeros[5] = {0}; // 所有元素都是0 return 0; }
💡 语法规则:
• 格式:类型 数组名[大小];
• 大小必须是常量常量表达式
• 索引从0开始,到大小-1结束
• 未初始化的元素值是随机的

访问数组元素

#include <iostream> using namespace std; int main() { int scores[5] = {85, 92, 78, 95, 88}; // 访问单个元素(索引从0开始) cout << "第1个成绩:" << scores[0] << endl; // 85 cout << "第3个成绩:" << scores[2] << endl; // 78 cout << "最后1个成绩:" << scores[4] << endl; // 88 // 修改元素值 scores[1] = 96; // 将第2个成绩改为96 cout << "修改后:" << scores[1] << endl; // 96 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(动态数组)

常见错误和注意事项

// ❌ 错误1:数组大小不能是变量 int n; cin >> n; int arr[n]; // 错误!n不是常量 // ✅ 正确:使用常量 const int SIZE = 10; int arr[SIZE]; // 正确 // ❌ 错误2:数组越界 int arr[5]; arr[5] = 100; // 错误!最大索引是4 // ❌ 错误3:整体赋值 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个学生的成绩,然后输出最高分、最低分和平均分。

输入人数后点击"生成代码"...