指针和const

图片来源:https://www.pixiv.net/en/artworks/65883716

TL;DR

语法含义
const T*指向 const 对象的指针
T* const指向对象的 const 指针
const T* const指向 const 对象的 const 指针

吐槽“指针常量”和“常量指针”

这两个概念本身的含义都很简单,但所谓“指针常量”和“常量指针”的说法却将这两个概念理解和记忆难度成倍提升了。每当只看这两个中文,想要“顾名思义”的时候,我总会陷入混乱:

  • 常量指针: 既可以理解为指向某个常量的指针(const T *),也可以理解为“常量”是对“指针”的修饰(T *const
  • 指针常量: 这个倒没什么歧义,像“整型常量”一样去理解就行,但定义语法看起来却又和整型常量完全不同:整形常量(const int), 指针常量(int *const

当然如果只是以上这样,只要能做到概念统一的话那倒也没什么,权当我自己脑抽了,但好死不死《C++ Primer中文版(第5版)》里对这两个概念的英文直译又和百度百科里的定义完全相反

百度百科的定义

《C++ Primer》里的定义

  • 指向常量的指针(pointer to const):const T *
  • 常量指针(const pointer):T * const

另外,如果采用“指针常量”和“常量指针”的说法,当遇到“const T * const”时,是不是该叫“常量指针常量”😅(当然网上看到的说法大多为“指向常量的常指针”、“指向常量的指针常量”)

官方文档里的定义

当前的C++官方文档“指针声明”这一章的中文翻译里并没有上面这两个说法,取而代之的是“指向 const 对象的指针(pointer to constant object)”和“指向对象的 const 指针(constant pointer to object)

  • 指向 const 对象的指针:指针变量本身可以修改(即可以指向不同对象),但不能修改“指向的对象”里的内容(即对于指针p来说, “p = &a”可行,“*p = a”不可行)
  • 指向对象的 const 指针:指针变量本身初始化后不可再修改(即不能指向其他对象),但可以修改“指向的对象”里的内容(即对于指针p来说, “p = &a”不可行,“*p = a”可行)
语法含义
const T*指向 const 对象的指针
T const*指向 const 对象的指针
T* const指向对象的 const 指针
const T* const指向 const 对象的 const 指针
T const* const指向 const 对象的 const 指针
指针声明语法

*” 前的 “const” 修饰的是类型 “T”,约束的是对象;“*” 后的 “const” 修饰的是 “*”,约束的是指针。这样的定义使语法统一,毕竟定义多个指针的写法是 “T *pa, *pb;” 而不是 “T* pa, pb;


参考:

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注