为什么是:
int *a = 0;
int const *b = a; /* Totally fine. */
int **c = 0;
int const **d = c; /* Generates a nasty warning. */
Run Code Online (Sandbox Code Playgroud)
隐式转换为更 const 的类型不是应该可以吗?
有什么好的方法可以解决它吗?基本上我有以下数组:
int **a;
Run Code Online (Sandbox Code Playgroud)
我想在没有丑陋的显式转换的情况下调用以下函数:
void foo1(int const **a);
void foo2(int const * const *a);
Run Code Online (Sandbox Code Playgroud)
情况很复杂。
不能将 char ** 值分配给 const char ** 指针的原因有些模糊。鉴于 const 限定符完全存在,编译器希望帮助您遵守不修改 const 值的承诺。这就是为什么您可以将 char * 分配给 const char *,但不能反过来:将常量“添加”到一个简单的指针显然是安全的,但将其删除会很危险。但是,假设您执行了以下更复杂的一系列作业:
const char c = 'x'; /* 1 */
char *p1; /* 2 */
const char **p2 = &p1; /* 3 */
*p2 = &c; /* 4 */
*p1 = 'X'; /* 5 */
Run Code Online (Sandbox Code Playgroud)
将 char ** 分配给 const char **(如第 3 行和原始问题中)并不是立即危险的。但是它设置了一种情况,在这种情况下,p2 的承诺——最终指向的值不会被修改——不能被保留。
(C++ 有更复杂的分配 const 限定指针的规则,这使您可以在不产生警告的情况下进行更多类型的分配,但仍然可以防止无意中尝试修改 const 值。C++ 仍然不允许将 char ** 分配给 const char * *,但它会让您摆脱将 char ** 分配给 const char * const *。)
在 C 中,如果必须分配或传递在第一级间接之外具有限定符不匹配的指针,则必须使用显式强制转换(例如 (const char **) 在这种情况下),尽管与往常一样,需要这样的演员表可能表明演员表没有真正解决的更深层次的问题。
http://c-faq.com/ansi/constmismatch.html