C语言二维数组
👇😊 C语言二维数组深度解析! 😊👇
🌈 1. 二维数组是什么?
现在你的手里一个数学表格📊,或者一个棋盘♟️,每个格子可以存放一个数据。
- 行(Row) → 横向排列(比如Excel中的行号)
- 列(Column) → 纵向排列(比如Excel中的列标)
- 元素 → 每个格子里的数据
例如:
1 | 学生成绩表(3个学生,2门课) |
🌈 2. 二维数组的声明与初始化
2.1 声明二维数组
📝 语法:数据类型 数组名[行数][列数];
1 | int scores[3][2]; // 3行2列的整型数组(3学生×2科目) |
2.2 初始化二维数组
逐行初始化:用大括号分组
1
2
3
4
5int scores[3][2] = {
{80, 90}, // 第0行:学生1的语文和数学成绩
{70, 85}, // 第1行:学生2的成绩
{95, 88} // 第2行:学生3的成绩
};省略行数(编译器自动计算行数):
1
2
3
4
5int scores[][2] = {
{80, 90},
{70, 85},
{95, 88}
};不完整初始化:剩余元素补0
1
2
3
4int matrix[2][3] = {
{1}, // 第0行 → [1,0,0]
{2,3} // 第1行 → [2,3,0]
};
🌈 3. 访问二维数组元素
- 索引规则:
数组名[行号][列号] - 索引从0开始!最大行号 = 行数-1,最大列号 = 列数-1
🌰 例子:
1 | int scores[3][2] = {{80,90}, {70,85}, {95,88}}; |
💥 致命错误:越界访问!
1 | scores[3][0] = 60; // ❌ 行号最大是2(共3行) |
🌈 4. 内存中的二维数组
二维数组在内存中是按行连续存储的!
例如 int arr[2][3] = {{1,2,3}, {4,5,6}} 的内存布局:
1 | 地址低 → 高 |
- 访问
arr[1][1]→ 实际是第1*3 +1 =4个元素(值5)
用一维视角理解二维数组
可以把二维数组看作一个“被折叠”的一维数组:
1 | int arr[2][3] = {{1,2,3}, {4,5,6}}; |
🌈 5. 遍历二维数组
用嵌套循环:外层循环行,内层循环列
1 | int scores[3][2] = {{80,90}, {70,85}, {95,88}}; |
输出:
1 | 80 90 |
🌈 6. 二维数组与指针
二维数组名是指向第一个元素(即第0行)的指针:
1 | int arr[2][3] = {{1,2,3}, {4,5,6}}; |
🌈 7. 动态二维数组(进阶)
使用指针数组 + malloc 动态创建二维数组:
1 | int rows = 3, cols = 2; |
🌈 8. 常见错误
行列顺序颠倒:
1
2int arr[2][3];
arr[3][2] = 5; // ❌ 行号最大1,列号最大2错误初始化:
1
2
3int arr[2][3] = {1,2,3,4,5,6}; // ✅ 但可读性差
int arr[2][3] = {{1,2}, {3}}; // ✅ 补0 → [1,2,0], [3,0,0]
int arr[2][3] = {{1,2,3,4}}; // ❌ 第0行元素过多动态数组未释放内存 → 内存泄漏!
🌈 9. 练习时间!
练习1:求二维数组的总和
写一个函数 int sumMatrix(int matrix[][3], int rows),计算3列二维数组所有元素的和。
练习2:矩阵转置
写一个函数 void transpose(int src[][3], int dest[][2], int rows),将2行3列的矩阵转置为3行2列的矩阵(行列互换)。
练习3:动态创建二维数组
动态创建一个4行5列的整型二维数组,并初始化所有元素为0。
🎯 参考答案
练习1:
1 | int sumMatrix(int matrix[][3], int rows) { |
练习2:
1 | void transpose(int src[][3], int dest[][2], int rows) { |
练习3:
1 | int rows = 4, cols = 5; |
🚀 总结:二维数组就是“数组的数组”,想象成表格或棋盘更容易理解!掌握行优先存储、嵌套循环遍历和动态内存管理,其实二维数组也不难!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Matou🚢!
评论


