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

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

将指针到非Const转换为指针到Const的合法行为。

那么,为什么转换指向非连续的指针转到指向Const的指针?

例如,为什么下列代码是非法的:

char *s1 = 0;const char *s2 = s1;
 // OK...
 char *a[MAX]; // aka char **
 const char **ps = a; // error!


温温酱
浏览 1086回答 3
3回答

波斯汪

从标准:const char c = 'c';char* pc;const char** pcc = &pc;   // not allowed*pcc = &c;*pc = 'C';                // would allow to modify a const object

倚天杖

忽略代码并回答问题的原则,请参阅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 *.)
打开App,查看更多内容
随时随地看视频慕课网APP