跳转至

4.1 数组基础

为什么要有数组?

没数组时存50个成绩得写50个变量,数组一行搞定。

int scores[50];    // 一排50个小格子,每个存一个分数

数组长什么样

int scores[5] = {85, 92, 78, 90, 88};

在内存里:

┌────┬────┬────┬────┬────┐
│ 85 │ 92 │ 78 │ 90 │ 88 │
└─┬──┴─┬──┴─┬──┴─┬──┴─┬──┘
  0    1    2    3    4   ← 下标(索引)

⚠️ 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 寄存器操作打基础