c++ - 我应该如何使用指针将二维数组传递给 c++ 中的函数
问题描述
我无法将由main
函数初始化的 C++ 中的二维数组传递给addMatrix
函数。
错误消息
Main.cpp:在函数 'int main()' 中:Main.cpp:15:23:错误:无法转换 'int ()[(((sizetype)(((ssizetype)c) + -1)) + 1)]' to 'int' for argument '1' to 'void addMatrix(int, int*, int, int)'
addMatrix(a,b,r,c);
void addMatrix(int**, int**, int, int);
int main()
{
int r, c, i, j;
cin >> r >> c;
int a[r][c], b[r][c];
// ASSUME HAVE TAKEN INPUTS FROM BOTH THE MATRIX A AND B
addMatrix(a, b, r, c);
}
void addMatrix(int** a, int** b, int r, int c)
{
int i, j, d[r][c];
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
d[i][j] = a[i][j] + b[i][j];
for(i = 0; i < r; i++)
{
for(j = 0; j < c; j++)
cout << d[i][j] << " ";
cout << endl;
}
}
解决方案
这些声明的数组
int a[r][c],b[r][c];
在表达式中使用,例如函数参数被隐式转换为指向它们类型的第一个元素的指针int ( * )[c]
。
但是相应的函数参数具有类型int **
。
void addMatrix(int **,int **,int,int);
因此编译器会发出错误,因为这些类型不兼容。
请注意,可变长度数组不是标准的 C++ 功能。
改用类模板的对象std::vector
。
如果您的编译器支持可变长度数组,则该函数应声明为
void addMatrix( int, int, int [][*], int [][*] );
或者如果声明同时是函数定义,那么
void addMatrix( int r, int c, int [][c], int [][c] );
或(用于自我记录)
void addMatrix( int r, int c, int [r][c], int [r][c] );