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