您的数组实际上是扁平的,这意味着您必须将其类型转换为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