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 的数组,有效的下标范围是 0 到 4。
访问第一个元素并打印:
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 行,以此类推。
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. 内存连续性
无论是几维数组,内存中都是连续的字节块。理解这一点有助于掌握指针操作数组的高级技巧。

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