将指针分配给带或不带限定符的指针

Assigning pointers to pointers with or without qualifiers

本文关键字:指针 分配      更新时间:2023-10-16

虽然编译:

char* p2c;
const char* p2cc = p2c; //fine

由于 LHS 尖头类型具有 RHS 尖头型的所有限定符,因此不会:

char** p2p2c;
const char** p2p2cc = p2p2c; //fail

但这确实:

const char * const * p2cp2cc = p2p2c; //fine

为什么会这样?

这不起作用:

char** p2p2c;
const char** p2p2cc = p2p2c; //fail

如果允许这样做,您将被允许打破常量正确性:

const int k = 10;
int *p;
int **pp = &p;
int const **kpp = pp;     // Should this be allowed, if so:
*kpp = &k;                // fine, kpp promises not to change it
                          // yet this does p = &k;
                          // p made no such promise! this is a hidden const_cast!
*p = 5;

如果允许分配,您将启用设置非常量指针(中间)以引用常量值,这可能会导致以不明显的方式出现未定义的行为。通过禁止该操作,类型系统更安全。

但这确实:

const char * const * p2cp2cc = p2p2c; //fine

这很好,因为中间指针是固定的,因此不可能重置中间指针以引用 const 对象并破坏常量正确性

cdecl 在这种情况下确实有帮助。

const char** p2p2cc = declare p2p2cc as pointer to pointer to const char

const char * const * p2cp2cc = declare p2cp2cc as pointer to const pointer to const char

如您所见,第二个版本具有内部 AND 外部指针常量,这意味着它也不能修改。第一个版本具有 INNER 指针 const 和外部 non-const,从而破坏 constnes。

另一方面,这有效:

char** const p = p2p2c;