指针和const限定符之间有两种关系:指向const对象的指针和const指针
这篇文章比较绕,请慢慢看
1.指向const对象的指针
我们经常用指针来修改其指向的对象的值。如果指针指向const对象,则不允许用指针来改变其所指向的const值,为了保证这个特性,C++语言强制要求指向const对象的指针也必须具有const特性:
const double *cptr;
这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型而非cptr本身。也就是说cptr本身不是const的。在定义是不用对他进行初始化,如果需要的话,允许给cptr重新赋值,使其指向一个const对象。但是不能通过cptr修改其所指向对象的值。
把一个const对象的地址赋值给一个普通的、非const对象的指针也会导致编译错误。
但是允许把非const对象的地址赋给指向const对象的指针。但是在这中情况下还是不能够修改指针所指向的对象的。
不使用指向const对象的指针修改基础对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指向的对象。本质上来说,由于没有办法分辨cptr所指向的对象是否为const,系统会把它所指向的所有对象都视为const。
如果指向const的指针所指向的对象宾根娥const,则可直接给该对象赋值或间接地利用普通的非const指针修改其值:毕竟这个值不是const。重要的是要记住:不能保证指向const的指针所指向的对象的值一定不能被 修改。
在实际的程序中指向const的指针常用作函数的形参。将形参定义为指向const的指针,以此确保传递给函数的实际对象在函数中不因为形参而被修改。
2.const指针
除了指向const对象的指针以外,C++还提供了const指针-----本身的值不饿能耐被修改。
int number=0;
int *const curNumber=&number;
我们可以从右向左吧上述定义的语句读作指向int型对象的const指针。与其他const量一样,const指针的值不能修改,这就意味着不能再使用这个指针指向其他对象。
与任何const对象一样。const指针也必须在定义时被初始化。
const指针是可以通过指针本身修改去指向的对象的,当然,实在这个对象可以被修改的情况下。
3.指向const对象的const指针
这种情况既不能修改数据也不能修改指针。
4.指针和typedef
假设给出一下语句:
typedef string *pstring;
const pstring cstr;
const pstring指针代表的真实类型是:
string *const cstr;他的本质是一个const指针指向strring类型而不是一个指向double const类型的指针。