图片来源:https://www.pixiv.net/en/artworks/65883716
TL;DR
语法 | 含义 |
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;
”
参考:
- 百度百科——常量指针
- 百度百科——指针常量
- 百度百科——常值指针
- 菜鸟教程——C++ 中常量引用、指向常量的指针、常量指针的区别
- cppreference.com——指针声明
- 《C++ Primer中文版(第5版)》
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。