【看到哪里写到哪里】在C里面怎么传递二维数组呢?
在 C 语言中,传递二维数组作为函数参数时,需要确保函数能够正确解析数组的内存布局。由于 C 语言的二维数组在内存中是连续存储的(按行优先),因此参数传递时必须明确列数或使用动态内存分配。以下是几种常见的传递方式及示例:
1. 明确指定列数
最直接的方式是在函数参数中明确指定二维数组的列数。
// 方式1:明确指定行数和列数
void printArray1(int arr[2][3], int rows, int cols) {for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {printf("%d ", arr[i][j]);}printf("\n");}
}// 方式2:省略行数,但必须指定列数
void printArray2(int arr[][3], int rows) {for (int i = 0; i < rows; i++) {for (int j = 0; j < 3; j++) {printf("%d ", arr[i][j]);}printf("\n");}
}int main() {int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};printArray1(arr, 2, 3); // 输出: 1 2 3 \n 4 5 6printArray2(arr, 2); // 输出相同return 0;
}
关键点
- 列数必须固定:编译器需要知道每行的元素个数,以便计算内存偏移量。
- 行数可省略:函数内部通过参数
rows
动态获取行数,但列数必须在编译时确定。
2. 使用数组指针(推荐方式)
通过指向数组的指针传递,更清晰地表达参数类型。
// 使用数组指针:指向包含3个int的数组
void printArray(int (*arr)[3], int rows) {for (int i = 0; i < rows; i++) {for (int j = 0; j < 3; j++) {printf("%d ", arr[i][j]);}printf("\n");}
}int main() {int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};printArray(arr, 2); // 输出: 1 2 3 \n 4 5 6return 0;
}
关键点
int (*arr)[3]
:声明一个指针arr
,指向包含 3 个int
的数组。- 等价于
void printArray(int arr[][3], int rows)
,但更明确表达参数类型。