C语言 将 2D 数组(矩阵)传递给函数

C语言中,将二维数组作为函数参数传递时,有一些特殊之处,主要涉及数组的存储方式和函数参数的传递方式。二维数组在内存中是连续存储的,可以看作是一个一维数组。因此,在函数中访问二维数组元素时,需要根据数组的行数和列数来计算元素的地址。将 2D 数组(矩阵)传递给函数有几种方式。常见的方式是通过指针传递或显式指定数组的维度。

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

推荐阅读
cjavapy编程之路首页