C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)

来源:互联网 发布:mac显示flash版本过低 编辑:程序博客网 时间:2024/05/18 19:47
void func(const int ** arg){} int main(int argc, char **argv){    int **p;    func(p);    return 0;}

这个代码用gcc编译会出现这样的错误:
main.cpp: 在函数‘int main(int, char**)’中:
main.cpp:8:8: 错误: 从类型‘int**’到类型‘const int**’的转换无效 [-fpermissive]
main.cpp:1:6: 错误:   初始化‘void func(const int**)’的实参 1 [-fpermissive]

make: *** [main.o] 错误 1


这是因为

const int ** p1;  // int元素不可修改int * const * p2; // int *一级指针不可修改int ** const p3;  // int **二级指针不可修改

形参const int **是说int元素不可以修改,而你如果传一个int **类型的参数,那么你也可以通过修改int *一级指针来修改int元素。

这样和你的预期就会不一致,这是很危险的行为。
那么如何解决:

void func(const int * const* arg)
这样就ok了。你也可以这样:

typedef const int * INTP; void func(const INTP * arg) // const修饰的是INTP,一级指针不可修改{} int main(int argc, char **argv){    int **p;    func(p);    return 0;}



0 1
原创粉丝点击