为了账号安全,请及时绑定邮箱和手机立即绑定

为什么将“指向非const的指针”转换为“指向const的指针”是不合法的?

为什么将“指向非const的指针”转换为“指向const的指针”是不合法的?

C++
温温酱 2019-07-08 12:37:24
为什么将“指向非const的指针”转换为“指向const的指针”是不合法的?它是将指针到非Const转换为指针到Const的合法行为。那么,为什么转换指向非连续的指针转到指向Const的指针?例如,为什么下列代码是非法的:char *s1 = 0;const char *s2 = s1;  // OK...  char *a[MAX]; // aka char **  const char **ps = a; // error!
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

从标准:


const char c = 'c';

char* pc;

const char** pcc = &pc;   // not allowed

*pcc = &c;

*pc = 'C';                // would allow to modify a const object


查看完整回答
反对 回复 2019-07-08
?
倚天杖

TA贡献1828条经验 获得超3个赞

忽略代码并回答问题的原则,请参阅comp.lang.c常见问题中的以下条目:为什么我不能将char*传递给期望const char*的函数?

不能分配char **值到const char **指针有点模糊。鉴于const存在限定符,编译器希望帮助您遵守不修改的承诺。const价值。这就是为什么您可以分配一个char *转到const char *,但事实并非如此:“添加”显然是安全的。const-指向一个简单的指针,但把它拿走是危险的。但是,假设您执行了以下更复杂的一系列任务:

const char c = 'x';    /* 1 */char *p1;              /* 2 */const char **p2 = &p1; /* 3 */*p2 = &c;             
 /* 4 */*p1 = 'X';             /* 5 */

在第3行中,我们分配了一个char **转到const char **..(编译器应该会抱怨。)在第4行中,我们分配了一个const char *转到const char *这显然是合法的。在第5行中,我们修改了char *指向-这应该是合法的。然而,p1最后指向c,也就是const..这发生在第4行,因为*p2是真的p1..这是在第3行中设置的,它是不允许的表单的赋值,这正是不允许第3行的原因。

当你的问题被标记为C+而不是C时,它甚至解释了const改为使用限定符:

(C+有更复杂的规则来分配Const限定的指针,这些规则允许您在不引起警告的情况下执行更多类型的赋值,但仍然可以防止无意中修改Const值的尝试。C+仍然不允许分配char **转到const char **,但它可以让您通过分配char **转到const char * const *.)


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 1081 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信