打印二维数组作为 C++ 中的方法

Print 2D Array as a Method in C++

我想用 C++ 编写一个打印二维数组的方法。此方法无效,它具有以下参数作为输入:二维数组、行数、列数。我想使用二维矩阵作为双指针来调用函数。我想以二维形状打印元素。我收到以下错误:

error: cannot convert ‘int (*)[2]’ to ‘int**’

编辑:将 int** list 更改为 int (*list)[2] 可行,但有没有一种方法我不必手动编写列号,因为我希望这种方法适用于不同的大小数组。

#include <iostream>

using namespace std;

void printArray2D(int** list, int row, int col) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cout << list[i][j] << " ";
        }
        cout << endl;
    }
}

int main()
{
    int list1[2][2] = { {1,2},{3,4} };

    int row1 = sizeof(list1) / sizeof(list1[0]);
    
    int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);

    printArray2D(list1, row1, col1);

    return 0;
}
 

您的数组实际上是扁平的,这意味着您必须将其类型转换为 int*,而不是 int**int** 指的是指向 int 数组的指针数组,但数组中没有指针。

换句话说,您实际上拥有一维整数数组(平面)。任何 C 多维数组,如 int a[3][5]int a[3][5][7] 都是平面数组,本质上是一维的。 [3][5] 数组指向内存中包含 3 * 5 = 15 个整数的连续区域,[3][5][7] 数组指向内存中连续区域中的 3 * 5 * 7 = 105 个整数。

此外,转换为 int* 后,有关维度的信息也会丢失,因此您必须通过使用 [i * col + j]:

手动进行索引算法

Try it online!

#include <iostream>

using namespace std;

void printArray2D(int* list, int row, int col) {
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            cout << list[i * col + j] << " ";
        }
        cout << endl;
    }
}

int main()
{
    int list1[2][2] = { {1,2},{3,4} };

    int row1 = sizeof(list1) / sizeof(list1[0]);
    
    int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);

    printArray2D((int*)list1, row1, col1);

    return 0;
}

输出:

1 2 
3 4 

实际上有一个使用模板的 C++ 特定解决方案,可用于保留有关维度的信息并将此信息转发给函数,那么您不必使用手动索引算法:

Try it online!

#include <iostream>

using namespace std;

template <int Rows, int Cols>
void printArray2D(int const (&list)[Rows][Cols]) {
    for (int i = 0; i < Rows; i++) {
        for (int j = 0; j < Cols; j++) {
            cout << list[i][j] << " ";
        }
        cout << endl;
    }
}

int main()
{
    int list1[2][2] = { {1,2},{3,4} };

    int row1 = sizeof(list1) / sizeof(list1[0]);
    
    int col1 = sizeof(list1[0]) / sizeof(list1[0][0]);

    printArray2D(list1);

    return 0;
}

输出:

1 2 
3 4 

如果您有固定的多维数组,另一个不错的解决方案是使用 std::array。然后你不需要转发任何尺寸信息,只需使用 std::array:

.size() 方法

Try it online!

#include <iostream>
#include <array>

template <typename ArrT>
void printArray2D(ArrT const & list) {
    for (int i = 0; i < list.size(); i++) {
        for (int j = 0; j < list[i].size(); j++) {
            std::cout << list[i][j] << " ";
        }
        std::cout << std::endl;
    }
}

int main()
{
    std::array<std::array<int, 2>, 2> list1 =
        { std::array{1,2}, std::array{3,4} };
    printArray2D(list1);
    return 0;
}

输出:

1 2 
3 4