3

可能重复:
为什么将(指向非 const 的指针的指针)转换为(指向 const 的指针的指针)是不合法的

我正在编写一个将二维数组作为输入的函数,并且不会更改基础值,我想在函数声明中明确指定它。我对这段代码有点困惑(这显然只是一个最小的虚拟代码来说明我的问题):

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) ?

谢谢

4

1 回答 1

2

这将需要

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

如果没有额外的 const,您的函数将能够执行以下操作:

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

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

于 2012-12-31T16:53:33.633 回答