我正在尝试编写一个采用可变大小数组并打印它的函数。但是我在编译时遇到了函数声明参数列表中的问题。
错误是:
cannot convert ‘int (*)[(((sizetype)(((ssizetype)r) + -1)) + 1)]’ to ‘int**’ for argument ‘1’ to ‘void printHalf(int**, int, int)’
printHalf( b, r, r);
代码:
#include <iostream>
using namespace std;
void printHalf( int **a, int row, int col ) { // Problem is here.
for( int i=0; i < row; i++) {
for( int j=0; j < col; j++) {
if( i <= j) {
cout << a[i][j] << " ";
}
}
cout << endl;
}
}
int main() {
int r;
cout << "No. of rows: ";
cin >> r;
int b[r][r];
for( int i=0; i < r; i++) {
for( int j=0; j < r; j++) {
cin >> b[i][j];
}
}
printHalf( b, r, r);
return 0;
}
导致此错误的原因是什么?如何将各种数组传递给函数?
答案 0 :(得分:3)
我看到的问题
C ++不允许声明可变长度数组。因此,
int b[r][r];
错了。
一维数组衰减到指针但二维数组不会衰减为指针指针。即使您已正确定义b
,例如:
int b[10][10];
您不能将b
用作期望int**
的函数的参数。
<强>解决方案强>
我建议使用std::vector
。
std::vector<std::vector<int>> b(r, std::vector<int>(r));
相应地更改功能printHalf
。
void printHalf( std::vector<std::vector<int>> const& b ) { ... }
您不需要row
和col
作为参数,因为可以从std::vector
获取该信息。
答案 1 :(得分:2)
首先关闭int b[r][r];
是variable length array,在C ++中不是标准。如果您需要一个可以在运行时调整大小的容器,那么我建议您使用std::vector
std::vector<std::vector<int>> data(r, std::vector<int>(r, 0)); // create vector and set all elements to 0
然后您的打印功能将变为
void printHalf(const std::vector<std::vector<int>>& data) {
for( std::size_t i=0; i < data.size(); i++) {
for( std::size_t j=0; j < data[i].size(); j++) {
if( i <= j) {
cout << a[i][j] << " ";
}
}
cout << endl;
}
}
答案 2 :(得分:2)
[N][M]
的二维数组在内存中的布局与[N*M]
的一维数组相同。
void printHalf( int *a, int row, int col ) { // Problem is here.
for( int i=0; i < row; i++) {
for( int j=0; j < col; j++) {
if( i <= j) {
cout << a[i*col+j] << " ";
}
}
cout << endl;
}
}
然后您可以使用printHalf( &b[0][0], r, r)
调用它。
你的根本误解是数组和指针之间的关系。数组不是指针。 int**
可以被视为int*
的数组,而不是您拥有的数组。 b[0]
为您提供int[r]
。这与int*
不同。 b[0][0]
为您提供第一个int
。