将指针分配给带或不带限定符的指针
Assigning pointers to pointers with or without qualifiers
虽然编译:
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;
相关文章:
- 将指针分配给另一个指针时会发生什么情况?
- C++将一个指针分配给另一个指针时执行的类型检查
- 我似乎无法为指针分配一个数组,然后更改数组的内容
- C++为 void 指针分配一个字符串
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- MPI 集合通信中的指针分配
- 函数指针分配在创建 DLL 后导致错误
- 通过双指针分配指针
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以直接为指针分配地址吗?如果是,如何做到这一点
- 为什么为char指针分配内存不会截断char序列
- C++指针分配字符数组的地址
- 将 void 指针分配给另一个 void 指针
- 如何将不同的成员函数指针分配给注册类的不同实例?
- 如何为指针分配特定的内存地址?
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 将指针分配给另一个指针时会发生什么情况?
- 为指向C++中的对象/对象的指针分配堆内存
- 将指针分配给字符串变量中包含的地址
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用