我正在编写一个将二维数组作为输入的函数,并且不会更改基础值,我想在函数声明中明确指定它。我对这段代码有点困惑(这显然只是一个最小的虚拟代码来说明我的问题):
int doNotChangeA(int const *a){
return a[0]+3;
}
int doNotChangeC(int const **c){
return c[0][0]+3;
}
int main(){
int *a= new int[1];
a[0]= 5;
int b= doNotChangeA(a);
delete []a;
int **c= new int*[1];
c[0]= new int[1];
c[0][0]= 6;
int d= doNotChangeC(c);
delete []c[0];
delete []c;
return 0;
}
此代码产生编译错误:
cst.cpp:19: error: invalid conversion from ‘int**’ to ‘const int**’
cst.cpp:19: error: initializing argument 1 of ‘int doNotChangeC(const int**)’
所以,我有点困惑——为什么允许第一部分(传递给 doNotChangeA 的非 const 1D 数组)而不允许第二部分(传递给 doNotChangeC 的非 const 2D 数组)?
基本上我想做的是让 c 成为 int**,它指向非常量值,因为我想在调用 doNotChangeC 之前和之后用它做任何我想做的事情。当然,我可以将 doNotChangeC 更改为仅采用 int** 而不是 int const** 这将“解决”问题,但我想明确表明 doNotChangeC 不会更改底层的二维数组。
是正确的做法:
int d= doNotChangeC( const_cast<int const**>(c) );
这编译得很好,但我很困惑为什么第一部分不需要它,即一维数组 (doNotChangeA) ?
谢谢