多维数组
二维数组、矩阵操作、内存布局(行优先)
多维数组
二维数组 = 数组的数组。C 中二维数组在内存中是行优先的——同一行的元素是连续的。
学完本章你将: 掌握二维数组声明/初始化、矩阵操作、内存布局。
二维数组声明
c
#include <stdio.h>
int main() {
// 3 行 4 列的二维数组
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
};
// 访问
printf("%d\n", matrix[0][2]); // 3
printf("%d\n", matrix[2][3]); // 12
return 0;
}
遍历二维数组
c
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%2d ", matrix[i][j]);
}
printf("\n");
}
内存布局 —— 行优先
c
// matrix[2][3] 在内存中的实际排列:
// [0][0] [0][1] [0][2] [1][0] [1][1] [1][2]
// 可以当成一维数组访问
int *p = &matrix[0][0];
for (int i = 0; i < 2 * 3; i++) {
printf("%d ", p[i]); // 1 2 3 4 5 6
}
省略第一维长度
c
// 第一维可以省略,第二维不行
int matrix[][3] = {
{1, 2, 3},
{4, 5, 6},
};
// int matrix[][] = {...}; // ❌ 编译错误
💡 编译器需要知道除了第一维以外的所有维度大小,才能计算出每个元素的位置。
多维数组作为函数参数
c
// 必须指定除第一维以外的维度
void printMatrix(int m[][4], int rows) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < 4; j++) {
printf("%2d ", m[i][j]);
}
printf("\n");
}
}