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;
}