C++ 中,将二维数组传递给函数时,通常需要显式指定列数(如 void func(int arr[][3], int rows)),因为数组在内存中是按行连续存储的;也可以使用指针并手动计算偏移(如 int* arr, int rows, int cols),或采用 std::vector<vector<int>> 实现更灵活的传参方式;若数组大小在编译期已知,还可用模板函数(如 template<size_t R, size_t C>)进行类型安全的传递。

1、使用固定列数的原始数组

当将二维数组传递给函数时,如果使用固定列数的原始数组(即非指针方式),必须在函数参数中指定列的大小,这样编译器才能正确地计算内存偏移。

#include <iostream>

const int COLS = 3;

// 函数声明,必须指定列数
void printMatrix(int matrix[][COLS], int rows) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < COLS; ++j) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main() {
    int data[2][COLS] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    printMatrix(data, 2);  // 传递行数
    return 0;
}

2、使用指针并传入列数

将二维数组传递给函数时,如果使用指针方式并传入列数,需要手动管理每行的列数信息。

#include <iostream>
using namespace std;

// 函数声明,传入二维数组指针和列数
void printArray(int* arr, int rows, int cols) {
    for (int i = 0; i < rows; ++i)
        for (int j = 0; j < cols; ++j)
            cout << "arr[" << i << "][" << j << "] = " << *(arr + i * cols + j) << endl;
}

int main() {
    int array[2][3] = { {1, 2, 3}, {4, 5, 6} };

    // 将二维数组地址和列数传入函数
    printArray(&array[0][0], 2, 3);

    return 0;
}

3、使用 std::vector(推荐用于灵活大小)

将二维数组传递给函数推荐使用 std::vector<std::vector<T>>,因为它提供更大的灵活性(支持动态大小、容器特性等)。

#include <iostream>
#include <vector>
using namespace std;

// 接收二维 vector 的函数
void printMatrix(const std::vector<std::vector<int>>& matrix) {
    for (const auto& row : matrix) {
        for (int val : row)
            std::cout << val << " ";
        std::cout << std::endl;
    }
}

int main() {
    // 创建一个 3x4 的二维数组(vector 形式)
    std::vector<std::vector<int>> matrix = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    // 传递给函数
    printMatrix(matrix);

    return 0;
}

4、使用模板(通用写法)

为了通用地将任意大小的二维数组传递给函数,可以使用模板来实现。

#include <iostream>
using namespace std;

template <typename T, size_t ROWS, size_t COLS>
void printMatrix(T (&matrix)[ROWS][COLS]) {
    for (size_t i = 0; i < ROWS; ++i) {
        for (size_t j = 0; j < COLS; ++j) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << "\n";
    }
}

int main() {
    int matrix1[2][3] = {{1, 2, 3}, {4, 5, 6}};
    double matrix2[3][2] = {{1.1, 2.2}, {3.3, 4.4}, {5.5, 6.6}};

    std::cout << "Matrix 1:\n";
    printMatrix(matrix1);

    std::cout << "\nMatrix 2:\n";
    printMatrix(matrix2);

    return 0;
}

推荐文档