我想用 C 撰寫一個列印二維陣列的方法。此方法是無效的,它具有以下引數作為輸入:二維陣列、行數、列數。我想使用二維矩陣作為雙指標來呼叫函式。我想以 2D 形狀列印元素。我收到以下錯誤:
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;
}
uj5u.com熱心網友回復:
您的陣列實際上是扁平的,這意味著您必須將其型別轉換為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]:
在線試試吧!
#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 特定解決方案,可用于保留有關維度的資訊并將此資訊轉發給函式,然后您不必使用手動索引演算法:
在線試試吧!
#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。那么你不需要轉發任何維度資訊,只需使用.size()方法std::array:
在線試試吧!
#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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360381.html
