4.1 数组基础
为什么要有数组?
没数组时存50个成绩得写50个变量,数组一行搞定。
数组长什么样
在内存里:
⚠️ C语言下标从 0 开始,不是1!
- scores[0] = 85 ✅
- scores[1] = 92 ✅
- scores[5] = ❌ 越界,不存在!
三种声明方式
// 方式1:声明时赋初值(最常用)
int a[5] = {10, 20, 30, 40, 50};
// 方式2:让编译器自己数个数
int b[] = {10, 20, 30, 40, 50}; // 编译器自动算出5个
// 方式3:声明空数组,再逐个赋值
int c[5];
c[0] = 10;
c[1] = 20;
// 没赋值的格子是垃圾值!
读取和修改
int scores[] = {85, 92, 78, 90, 88};
// 读取
printf("%d", scores[0]); // 打印 85
printf("%d", scores[2]); // 打印 78
// 修改
scores[2] = 100; // 78变成100
数组 + for循环 = 绝配
数组下标 0,1,2,3,4 和 for 循环的 i=0,1,2,3,4 完美配对:
int scores[] = {85, 92, 78, 90, 88};
int count = 5;
for (int i = 0; i < count; i++) {
printf("第%d个成绩: %d\n", i+1, scores[i]);
}
// 输出:
// 第1个成绩: 85
// 第2个成绩: 92
// 第3个成绩: 78
// 第4个成绩: 90
// 第5个成绩: 88
sizeof 计算数组长度
int scores[] = {85, 92, 78, 90, 88};
sizeof(scores) // 整个数组占多少字节 = 20
sizeof(scores[0]) // 第一个元素占多少字节 = 4
int count = sizeof(scores) / sizeof(scores[0]); // 20 ÷ 4 = 5
这一招在C里很常用,不用自己数个数,让程序自己算。
完整示例:求总分和平均分
#include <stdio.h>
int main() {
int scores[] = {85, 92, 78, 90, 88};
int sum = 0;
int count = sizeof(scores) / sizeof(scores[0]);
for (int i = 0; i < count; i++) {
sum = sum + scores[i];
}
printf("总数: %d\n", sum); // 433
printf("平均: %.2f\n", (float)sum / count); // 86.60
return 0;
}
%.2f表示浮点数保留两位小数。
小练习:找最大值
#include <stdio.h>
int main() {
int nums[] = {3, 7, 2, 9, 4, 6};
int max = nums[0]; // 先假设第一个最大
for (int i = 1; i < 6; i++) {
if (nums[i] > max) { // 如果找到更大的
max = nums[i]; // 就更新max
}
}
printf("%d\n", max); // 输出 9
return 0;
}
总结
| 概念 | 要点 |
|---|---|
| 数组本质 | 一排同类型数据的连续格子 |
| 下标 | 从0开始,不是1 |
| 声明 | int arr[5] = {...}; 或 int arr[] = {...}; |
| 与for循环 | 天生一对,用 i 遍历每个元素 |
| 长度计算 | sizeof(arr) / sizeof(arr[0]) |
| 越界 | 访问不存在的下标会出大问题 |
继续提示
你练完找最大值后,下一步: - 字符数组 → 写一个串口消息发送的小程序 - 函数封装 → 把"找最大值"包装成一个函数 - 指针初探 → 为 STM32 寄存器操作打基础