常量指针 是指向常量的指针。
表示指针本身值可以改,但指向值不可以改。即p的值可以变,但是*p不能变
形式是
const TYPE *p; 或者 TYPE const *p;
指针常量 是说指针本身是常量。 也就是p不可以改,但是*p是可以改的。
形式是
TYPE * const p;
复合起来 就是常量指针常量。。。 绕口吧,就是这样
定义
const TYPE * const p;
p和*p都不能改。
先看下面的例子:
const int ivar = 10;
const int * &var = &ivar; // 报错
const int * const &var = &ivar; // 正确
为什么var 必须是一个常量才行?这应该就是你问的问题吧
我们知道对引用定义的必须初始化一个对象【也就是变量】,那么&ivar 取地址得到的只是一个地址,它不是一个变量,也没有指针变量接受,所以c++必须给他一个临时变量用来存放改地址, 好,有了上面的基础,再来分析const int * &var = &ivar 为什么出错?
编译器会产生一个临时对象, 进而编译器将上述表带式转换成:
const int * temp = &ivar;
const int * &var = temp;
因为var 不是常量,只是一个常量指针的引用,var 可以修改,var 修改只会造成temp 的修改,但是&ivar 并没有修改,这就是矛盾了,因为上述的转换队程序员是透明的,所以c++ 为了防止这种情况出现,规定凡是出现临时对象的情况,必须将引用自身也改成const