隐式转换到 Const

Imb*_*bue 1 c

为什么是:

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)

Roe*_*rew 5

情况很复杂。

不能将 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