在 C++ 中有 const
常量限定符,即被限制的对象的值不可改变。
指针是指向(point to)另外一种类型的复合类型。
当指针遇上常量就会产生「常量指针」和「指针常量」。
指针有两个东西,一个是指针本身,一个是指针所指的那个变量。这两个东西都可以是常量。
指针本身可以是常量,指针所指的变量也可以是常量。
逐个分析:
- 指针本身是常量
int *const q = &i;
也就是说指针 q
的值不可被改变,也就是 q
指向 i
这个事实不可被改变,也就是 q
不可以再指向别人了。
int i = 1; |
- 指针所指向的变量是常量
const int *q = &i;
这里要搞清楚,i
的值是可以改变的,只是不能通过 q
来改变,因此 *q = 3;// ERROR
。
int i = 1, j = 2; |
看过上边的分析,再看下面三个表达式:
int i; |
是不是很迷糊。其实很简单:判断上面三个表达式的含义,可以根据 const
和 *
是谁在前面。
const
在*
前面,说明通过指针不可修改其指向的变量。const
在*
后面,说明指针本身不可修改。
也可以理解为:*
前面的是对被指向对象的修饰,*
后面的是对指针本身的修饰。
所以上边的三个表达式,前两个是一样的,是指向常量的指针(pointer to const)。第三个是常量指针(const pointer)。
我觉得「指针常量」这个翻译并不好,应该叫:指向常量的指针(pointer to const)。《C++ Primer》中的术语就是:指向常量的指针(pointer to const)和常量指针(const pointer)。