C++实现通用2D数组打印方法 解决int (*)[n]转int**类型报错问题
问题原因解释
静态二维数组的内存布局和int**类型不兼容:int list[2][2]是连续存储的2行2列数据,变量名list退化为指针后的类型是int (*)[2](指向长度为2的int数组的指针),而int**是指向int指针的指针,二者底层逻辑完全不同,因此直接传参会报类型转换错误。你修改为int (*list)[2]后虽然能运行,但参数里的列数2是硬编码的,无法适配其他列数的数组。
通用实现方案
方案1:模板自动推导数组尺寸(最优,无需手动传行列)
直接用模板接收静态二维数组的引用,编译器会自动推导行列数,完全不需要手动指定参数,可适配任意尺寸的静态二维数组。
完整可运行代码示例:
#include <iostream> using namespace std; // 模板自动推导二维数组的行数ROW和列数COL template<int ROW, int COL> void printArray2D(int (&list)[ROW][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 list2[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; // 直接传数组名即可,不需要手动计算行列 cout << "list1输出:" << endl; printArray2D(list1); cout << "list2输出:" << endl; printArray2D(list2); return 0; }
方案2:兼容动态二维数组的重载版本
如果你同时需要支持new出来的动态二维数组(int**类型),可以新增一个函数重载,两种场景都能覆盖:
// 重载版本:接收动态分配的int**二维数组 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** dyn_list = new int*[2]; // for(int i=0; i<2; i++) dyn_list[i] = new int[2]{i*2+1, i*2+2}; // printArray2D(dyn_list, 2, 2);
方案3:C风格无模板兼容实现
如果不想使用C++模板,可以把入参改为一维int指针,调用时传入数组首元素地址,手动计算偏移量访问元素:
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 row1 = sizeof(list1) / sizeof(list1[0]); // int col1 = sizeof(list1[0]) / sizeof(list1[0][0]); // printArray2D(&list1[0][0], row1, col1);
内容的提问来源于stack exchange,提问作者user6210457
相关产品推荐
相关产品推荐

