在 C++ 中有 const 常量限定符,即被限制的对象的值不可改变。

指针是指向(point to)另外一种类型的复合类型。

当指针遇上常量就会产生「常量指针」和「指针常量」。

指针有两个东西,一个是指针本身,一个是指针所指的那个变量。这两个东西都可以是常量。

指针本身可以是常量,指针所指的变量也可以是常量。

逐个分析:

  1. 指针本身是常量

int *const q = &i;

也就是说指针 q 的值不可被改变,也就是 q 指向 i 这个事实不可被改变,也就是 q 不可以再指向别人了。

int i = 1;
int *const q = &i;// q 是 const
*q = 26; // OK
++ q; // ERROR,q 的值不可被改变
  1. 指针所指向的变量是常量

const int *q = &i;

这里要搞清楚,i 的值是可以改变的,只是不能通过 q 来改变,因此 *q = 3;// ERROR

int i  = 1, j = 2;
const int *q = &i;// (*q) 是 const
*q = 3;// ERROR
q = &j;// OK
i = 3;// OK

看过上边的分析,再看下面三个表达式:

int i;
const int* p1 = &i;
int const* p2 = &i;
int *const p3 = &i;

是不是很迷糊。其实很简单:判断上面三个表达式的含义,可以根据 const* 是谁在前面。

  1. const* 前面,说明通过指针不可修改其指向的变量。
  2. const* 后面,说明指针本身不可修改。

也可以理解为:* 前面的是对被指向对象的修饰,* 后面的是对指针本身的修饰。

所以上边的三个表达式,前两个是一样的,是指向常量的指针(pointer to const)。第三个是常量指针(const pointer)。

我觉得「指针常量」这个翻译并不好,应该叫:指向常量的指针(pointer to const)。《C++ Primer》中的术语就是:指向常量的指针(pointer to const)和常量指针(const pointer)。

参考视频