文章目录

C 语言数组:一维数组与二维数组

发布于 2026-04-12 23:14:50 · 浏览 48 次 · 评论 0 条

C 语言数组:一维数组与二维数组

数组是 C 语言中用于存储一组相同类型数据的结构。想象一下,你需要存储 100 个学生的成绩,如果定义 100 个独立的变量(如 score1, score2, ...)会非常混乱。数组允许你用一个名字来管理这组数据,通过编号(下标)来访问其中的每一个元素。


一、一维数组:基础的数据容器

一维数组是最简单的数组形式,类似于排成一行的盒子,每个盒子都有一个编号。

1. 定义与初始化

定义一个一维数组需要指定数据类型、数组名和长度。

语法格式为:数据类型 数组名[数组长度];

定义一个包含 5 个整数的数组:

int scores[5];

初始化数组是指在定义时同时赋值。

完全初始化所有元素:

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

部分初始化,未赋值的元素默认为 0:

int scores[5] = {85, 90}; 
// 此时数组内容为: 85, 90, 0, 0, 0

省略长度初始化,编译器会根据元素个数自动判断长度:

int scores[] = {85, 90, 78, 92, 88}; 
// 长度自动确定为 5

2. 访问与修改元素

C 语言数组的下标从 0 开始。对于长度为 5 的数组,有效的下标范围是 04

访问第一个元素并打印

printf("%d", scores[0]); // 输出 85

修改第三个元素的值:

scores[2] = 95; // 将下标为 2 的元素(第三个)修改为 95

3. 遍历一维数组

处理数组通常使用循环结构。使用 for 循环遍历数组并打印所有元素:

#include <stdio.h>

int main() {
    int scores[5] = {85, 90, 78, 92, 88};
    int i;

    // 循环变量 i 从 0 到 4
    for (i = 0; i < 5; i++) {
        printf("第 %d 个成绩: %d\n", i + 1, scores[i]);
    }

    return 0;
}

二、二维数组:数据的表格形式

二维数组可以理解为“数组的数组”,或者想象成一张 Excel 表格,具有“行”和“列”两个维度。

1. 定义与初始化

语法格式为:数据类型 数组名[行数][列数];

定义一个 3 行 4 列的整数矩阵:

int matrix[3][4];

按行初始化,使用花括号区分每一行:

int matrix[3][4] = {
    {1, 2, 3, 4},   // 第 0 行
    {5, 6, 7, 8},   // 第 1 行
    {9, 10, 11, 12} // 第 2 行
};

省略行数初始化(行数可以省略,列数不可省略):

int matrix[][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8}
};
// 编译器自动计算出行数为 2

2. 内存存储结构

虽然我们逻辑上把它看作表格,但在计算机内存中,二维数组是连续存放的。C 语言采用“行优先”存储方式,即先存完第 0 行的所有元素,再存第 1 行,以此类推。

graph LR A["逻辑结构"] --> B["Row 0: [0][0] [0][1] [0][2] [0][3]"] B --> C["Row 1: [1][0] [1][1] [1][2] [1][3]"] C --> D["Row 2: [2][0] [2][1] [2][2] [2][3]"] E["物理内存"] --> F["地址连续: 0,0 -> 0,1 -> ... -> 1,0 -> ..."] style A fill:#f9f,stroke:#333,stroke-width:2px style E fill:#bbf,stroke:#333,stroke-width:2px

3. 访问与遍历二维数组

访问元素需要两个下标:数组名[行下标][列下标]。行下标和列下标都从 0 开始。

获取第 2 行第 3 列的值:

int val = matrix[1][2]; // 注意:实际上是逻辑上的第二行,下标为 1

使用双重 for 循环遍历二维数组。外层循环控制行,内层循环控制列:

#include <stdio.h>

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };
    int i, j;

    for (i = 0; i < 2; i++) {     // 遍历行
        for (j = 0; j < 3; j++) { // 遍历列
            printf("%d ", matrix[i][j]);
        }
        printf("\n"); // 每行结束后换行
    }

    return 0;
}

三、一维与二维数组对比与核心规则

为了更清晰地理解两者的区别,请参考下表:

维度 声明示例 下标数量 常见用途 循环遍历层数
一维 int arr[10]; 1 个 存储线性数据(如数列、字符串) 1 层 for
二维 int mat[3][4]; 2 个 存储矩阵、平面地图数据 2 层 for

核心注意事项

1. 数组下标越界(绝对禁止)

数组下标从 0 开始,最大合法下标是 长度 - 1访问超出范围的内存(如 int a[5]; 后使用 a[5]a[10])会导致未定义行为,可能引发程序崩溃或数据错误。

2. 数组长度必须是常量

在 C89 标准中,定义数组时长度必须是整型常量或常量表达式,不能是变量。

int n = 10;
int arr[n]; // 在老旧标准中可能报错,建议使用宏定义 #define N 10

3. 内存连续性

无论是几维数组,内存中都是连续的字节块。理解这一点有助于掌握指针操作数组的高级技巧。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文