1、使用指针传递
使用指针传递可以更灵活地处理矩阵,尤其是对于动态分配的二维数组。
#include <stdio.h> void printMatrix(int *matrix, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", *(matrix + i * cols + j)); } printf("\n"); } } int main() { int rows = 3, cols = 3; int matrix[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 传递数组的首地址 printMatrix((int *)matrix, rows, cols); return 0; }
2、使用显式指定列数的二维数组
如果矩阵的列数在编译时已知,可以在函数签名中明确指定列数,而行数仍然是可变的。
#include <stdio.h> void printMatrix(int matrix[3][3]) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } } int main() { int matrix[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; printMatrix(matrix); return 0; }
3、动态分配二维数组
如果矩阵的大小是动态的,可以使用 malloc
来分配内存,并将指针传递给函数。
#include <stdio.h> #include <stdlib.h> void printMatrix(int **matrix, int rows, int cols) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", matrix[i][j]); } printf("\n"); } } int main() { int rows = 3, cols = 3; int **matrix; // 动态分配二维数组 matrix = (int **)malloc(rows * sizeof(int *)); for (int i = 0; i < rows; i++) { matrix[i] = (int *)malloc(cols * sizeof(int)); } // 初始化矩阵 int counter = 1; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { matrix[i][j] = counter++; } } printMatrix(matrix, rows, cols); // 释放内存 for (int i = 0; i < rows; i++) { free(matrix[i]); } free(matrix); return 0; }