首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >指向const双指针参数的非连续指针参数。

指向const双指针参数的非连续指针参数。
EN

Stack Overflow用户
提问于 2010-08-09 07:36:39
回答 1查看 2.5K关注 0票数 7

星号前面的const修饰符意味着使用这个指针所指向的值不能被更改,而指针本身可以用来指向其他的东西。在下面

代码语言:javascript
代码运行次数:0
运行
复制
void justloadme(const int **ptr)
{
    *ptr = new int[5];
}

int main()
{
    int *ptr = NULL;
    justloadme(&ptr);
}

不应该允许justloadme函数编辑传递的param所指向的整数值(如果有的话),而它可以编辑int*值(因为const不是在第一颗星之后),但是为什么在GCC和VC++中都会出现编译器错误呢?

GCC:错误:从int**const int**的无效转换

VC++: error C2664:‘ convert’:无法将参数1从'int **‘转换为'const int **’。转换丢失限定符

为什么它说转换会失去限定符?它不是获得了const限定符吗?此外,它是否类似于strlen(const char*),在那里我们传递一个非const char*

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-09 07:44:20

与大多数情况一样,编译器是正确的,直觉是错误的。问题是,如果允许执行特定的任务,您可能会破坏程序中的const-正确性:

代码语言:javascript
代码运行次数:0
运行
复制
const int constant = 10;
int *modifier = 0;
const int ** const_breaker = &modifier; // [*] this is equivalent to your code

*const_breaker = & constant;   // no problem, const_breaker points to
                               // pointer to a constant integer, but...
                               // we are actually doing: modifer = &constant!!!
*modifier = 5;                 // ouch!! we are modifying a constant!!!

标记为*的线是该违规行为的罪魁祸首,并且由于该特定原因被禁止使用。该语言允许将const添加到最后一个级别,但不允许添加第一个级别:

代码语言:javascript
代码运行次数:0
运行
复制
int * const * correct = &modifier; // ok, this does not break correctness of the code
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3438125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档