4.1 数组

本篇学习数组的定义、初始化、遍历、查找和边界规则,并能用数组保存和处理一组同类型数据。

数组

概念说明

数组是一组连续存放的同类型元素。 它特别适合保存成绩、温度、坐标、字符序列这类“数量固定或可预估”的同类数据。

数组最关键的两个特征是:

  • 元素类型相同。
  • 内存连续排列。

这也是为什么数组访问效率高,但长度管理相对死板。 普通数组一旦定义,长度通常就固定下来了;如果想插入、删除或扩容,往往需要自己移动元素或重新分配空间。

语法/规则

  1. 一维数组定义形式是 类型 数组名[元素个数];
  2. 数组初始化可以写成 int nums[3] = {1, 2, 3};,也可以省略长度让编译器推断。
  3. 数组下标从 0 开始,到 长度 - 1 结束。
  4. 在定义数组的同一作用域内,常见长度写法是 sizeof(arr) / sizeof(arr[0])
  5. 数组名在很多表达式中会退化为首元素指针,但数组和指针并不是完全等价的东西。
  6. 普通数组不会自动扩容,也不会自动检查越界。
  7. 查找、统计、排序这类算法题,通常都会以数组为基础数据结构。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main(void) {
    int scores[] = {78, 82, 90, 86, 94};
    int len = (int)(sizeof(scores) / sizeof(scores[0]));
    int sum = 0;
    int max = scores[0];

    for (int i = 0; i < len; i++) {
        sum += scores[i];
        if (scores[i] > max) {
            max = scores[i];
        }
    }

    printf("sum = %d\n", sum);
    printf("max = %d\n", max);
    return 0;
}

输出结果:

1
2
sum = 430
max = 94

常见错误

  1. 把数组长度和最后一个下标混淆,例如长度为 5 却访问 scores[5]
  2. 以为数组会像高级语言容器一样自动扩容,结果直接写出了越界访问。
  3. 在函数里用 sizeof(arr) 计算传入数组长度,忘了它往往已经退化成指针。
  4. 插入或删除元素时只改了长度变量,却没有真正移动后续元素。
  5. 只验证中间位置的数据,没有专门检查第一个元素和最后一个元素的边界。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字