const
修饰指针有两种类型,一种是指向常量的指针,一种是指针本身是常量(即指针指向固定一块地址,不能更改,而这块地址中存储的内容可以是变量)。也有两者复合的结果(使用两个const)。
这里的关键是,const
这个说明符(specifier)的结合规则永远是结合到“最近的词”(而且优先向左)。具体判断时,要从标识符(identifier, 这里即为指针变量的名字)开始从右往左读:
const int* u; // u是一个指针,指向整型,这个整型是个常量。
int const * u; // u是一个指针,指向常量整型。(和上面等价)
int* const u; // u是一个常量指针,指向一个整型变量。 (与上面两个不同)
const int* const u; // u是一个常量指针,指向一个整型常量。
上面第一第二种定义方式是等价的,但是第二种有一定迷惑性。另一种帮助理解的方式是,指针符号*
是向右结合的。因此只有将* const
的格式才是指针常量。
使用说明
-
可以给指向const的指针分配一个non-const对象,因为这仅仅是在说:虽然这个对象可以变化,但我在使用这个指针时不会改变这个对象。故不矛盾。
-
但是,不可以给指向non-const的指针分配一个const对象,因为这会威胁到由const保证的安全性。
-
如果想要强行实现第二点,可以使用类型转化,来强行完成赋值。但是不推荐这么做。