C++ 将非常量多维数组传递给不使用';我不能改变它

C++ 将非常量多维数组传递给不使用';我不能改变它,c++,multidimensional-array,constants,argument-passing,C++,Multidimensional Array,Constants,Argument Passing,可能重复: 我正在编写一个函数,该函数将2D数组作为输入,并且不更改基础值,我希望在函数声明中明确指定这一点。我对这段代码有点困惑(很明显,这只是一段最小的伪代码来说明我的问题): 此代码产生编译错误: cst.cpp:19: error: invalid conversion from ‘int**’ to ‘const int**’ cst.cpp:19: error: initializing argument 1 of ‘int doNotChangeC(const int**)’

可能重复:

我正在编写一个函数,该函数将2D数组作为输入,并且不更改基础值,我希望在函数声明中明确指定这一点。我对这段代码有点困惑(很明显,这只是一段最小的伪代码来说明我的问题):

此代码产生编译错误:

cst.cpp:19: error: invalid conversion from ‘int**’ to ‘const int**’
cst.cpp:19: error:   initializing argument 1 of ‘int doNotChangeC(const int**)’
所以,我有点困惑——为什么第一部分(传递给doNotChangeA的非常量1D数组)是允许的,而第二部分(传递给doNotChangeC的非常量2D数组)是不允许的

基本上,我想做的是让c为int**,它指向非常量值,因为我想在调用doNotChangeC前后对它做任何我想做的事情。当然,我可以将doNotChangeC更改为只取int**而不是int const**这将“修复”这个问题,但我想明确地表明doNotChangeC不会更改底层的二维数组

正确的做法是:

int d= doNotChangeC( const_cast<int const**>(c) );
intd=doNotChangeC(const_cast(c));
这可以很好地编译,但我不明白为什么第一部分,即1-D数组(doNotChangeA)不需要这样做

谢谢

这需要

int doNotChangeC(int const *const *c){
    return c[0][0]+3;
}
如果没有额外的常量,您的函数将能够执行以下操作:

int doNotChangeC(int const **c){
    c[0] = &something_else;
    return c[0][0]+3;
}

请注意,这与C的工作方式不同。在C语言中,您仍然无法将
int**
传递给接受
int const*const*
的函数,因为它的规则更简单。

谢谢这两个,这就解释了这一点。感谢您的快速响应!你是对的,它确实解决了问题,但是我还是有点困惑。好的,我知道额外的const声明指向1D数组的指针不会改变,所以事实上这个声明完全反映了我最初想要的。但是,出于兴趣,为什么我的尝试是错误的?如果我希望能够改变指针,但是它们指向了const值,那我最初就被否决了,但是后来我意识到C++是正确的(我在想C,但它没有帮助)。因此,+1@OliCharlesworth:谢谢你的评论。两次落选后我开始担心了。@VaughnCato:没问题。也许值得在你的答案中指出这一差异,以避免进一步的随意否决!(这两种语言在这方面的差异确实很有趣。)@user1939941:如果你想这样做,你必须输入
int const**
。否则,类型系统中有一个危险的孔。
int doNotChangeC(int const **c){
    c[0] = &something_else;
    return c[0][0]+3;
}