第7天:数组 — 操作指南

📅 2026/7/30 21:33:57 👁️ 阅读次数 📝 编程学习
第7天:数组 — 操作指南

小白记录日常学习

一、今日任务总览

| 步骤 | 内容 | 时间 |
|------|------|------|
| ① | 阅读教材:第10章 §10.1-10.3 | 60分钟 |
| ② | 理解数组的存储结构和下标规则 | 30分钟 |
| ③ | 手打并运行3个练习 | 50分钟 |
| ④ | 自由实验 | 30分钟 |

二、今日核心知识点

2.1 数组是什么

数组就是把一堆同类型的数据放在连续的内存位置。

```
// 以前:需要5个变量
int s0, s1, s2, s3, s4; // 噩梦

// 现在:一个数组搞定
int scores[5]; // 清爽

内存布局:
scores[0] scores[1] scores[2] scores[3] scores[4]
[ ] [ ] [ ] [ ] [ ]
↑ 地址连续,一个挨一个
```

2.2 下标从 0 开始 ★

```c
int arr[5] = {10, 20, 30, 40, 50};

arr[0] = 10 ← 第一个元素
arr[1] = 20
arr[2] = 30
arr[3] = 40
arr[4] = 50 ← 最后一个元素
// arr[5] ← 越界!!C不会报错,但写了会出大问题
```

为什么从0开始? 因为 `arr[i]` 等价于 `*(arr + i)`——第 0 个元素的偏移量是 0。

2.3 数组 + for 循环 = 最佳搭档

```c
int arr[5] = {10, 20, 30, 40, 50};

// 遍历所有元素
for (int i = 0; i < 5; i++)
printf("%d ", arr[i]);

// 常用模式:求总和
int sum = 0;
for (int i = 0; i < 5; i++)
sum += arr[i];
```

2.4 sizeof 计算数组长度

```c
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]); // 总字节数 ÷ 单个字节数 = 元素个数
// 20 ÷ 4 = 5
```

2.5 二维数组

```c
int matrix[3][4]; // 3行4列

// 用双层循环遍历
for (int i = 0; i < 3; i++) // 行
for (int j = 0; j < 4; j++) // 列
printf("%d ", matrix[i][j]);
```

三、阅读任务(60分钟)

《C Primer Plus 第6版》第10章:

| 章节 | 内容 | 重点程度 |
|------|------|----------|
| §10.1 | 数组基本概念 | ★★★ |
| §10.2 | 一维数组的使用 | ★★★ |
| §10.3 | 多维数组 | ★★★ |
| §10.1 末尾 | 数组越界问题 | ★★★ |

> 今天不读指针部分(§10.4-10.7)!指针是第10天专门看的。

四、动手练习(50分钟)

练习1:学生成绩

```bash
gcc ex1_scores.c -o ex1_scores.exe
./ex1_scores.exe
```

输入5个成绩,观察统计结果。

改一改:把数组长度从5改成10,把所有 `5` 换成 `sizeof(scores)/sizeof(scores[0])`,感受一次改动自动适配的好处。

练习2:3×3矩阵

```bash
gcc ex2_matrix.c -o ex2_matrix.exe
./ex2_matrix.exe
```

必做题:改成计算副对角线之和(即 `matrix[0][2] + matrix[1][1] + matrix[2][0] = 3+5+7 = 15`)。

练习3:数组反转

```bash
gcc ex3_reverse.c -o ex3_reverse.exe
./ex3_reverse.exe
```

纸上追踪:画出数组 [1,2,3,4,5,6,7,8],用箭头标注前两轮交换:
- 第1轮:arr[0]↔arr[7] → [8,2,3,4,5,6,7,1]
- 第2轮:arr[1]↔arr[6] → [8,7,3,4,5,6,2,1]

五、自由实验(30分钟)

实验1:统计分数段

输入10个成绩(0-100),统计 A(90+) / B(80-89) / C(70-79) / D(60-69) / F(<60) 各多少人。

实验2:冒泡排序(手动模拟)

不需要写代码。对数组 `[5, 3, 8, 1, 9]`,在纸上模拟冒泡排序的每一轮交换过程。明天会正式写排序代码。

六、今日自检

- [ ] 知道数组下标从 0 开始
- [ ] 知道 `arr[5]` 声明了5个元素,最后一个下标是 4
- [ ] 知道越界不报错,后果不可预测
- [ ] 能用 `sizeof` 自动计算数组长度
- [ ] 能用 for 循环遍历一维数组
- [ ] 能用双层 for 遍历二维数组
- [ ] 三个练习全部运行成功

七、明天预告

第8天:函数— 代码复用的核心,也是理解指针的前置知识。