指针
在了解const与指针结合使用之前,需先了解指针是什么,理解指针对照着引用来理解。引用是变量的别名,指针指向对象,指针变量是指向对象的变量,有点难理解,用示例解释,
int a=10;
int &b=a; //b和a是名字,代表同一个地址,地址代表的位置存储字面值常量10
int *c=&a; //c是名字,代表了内存中一个地址,这个地址代表的位置存储a的地址
第三条语句定义了一个指向int类型的指针c,初始化c使其指向int类型对象a。“*”操作符表明c是一个指针变量,“&”是取地址操作符,&a表示的是变量a的地址。
指向const对象的指针
正如其名字,这一类的指针是指向const对象的指针。我们知道,const对象在定义时初始化后是不可以被修改的,而通过指针的解引用是可以获取指针所指向对象的值并进行操作的,所以指向const对象的指针需要被const限定符限定,使得该指针具有const特性。
const int a=100; //定义const对象a
const int *b=&a; //定义指向const对象的指针b,b指向const对象a
const int *c; //定义指向const对象的指针c,它可能指向const对象
上面这三条语句都是正确的。
第二条语句定义了指向a的指针, a的值是不可以被修改的,也不可以通过“*b”改变a的值。
第三条语句仅仅是定义了一个指向const对象的指针,它也是正确的,因为限定指向从const对象的指针具有const特性,所限定的是不可以通过“*c”来修改const对象的值,而不是限定指针变量c的值不可修改,所以第三条语句定义时可以不进行初始化。
另外,const限定的指针c可以不指向const对象,可以指向非const对象,只是不能通过“*c”来修改指向的对象的值,而对象的值是可以改变的。
int a=100;
int b=200;
const int *c=&a; //指向const对象的指针变量c指向int变量
a=300; //不可以通过“*c”改变a的值,但a的值是可变的,改变a的之后,
c的值不变,“*c”的值与a保持一致
c=&b; //const限定的是不可以通过“*c”改变指向对象的值,而不是限定
c的值不可以改变,c也可以指向别的同类型对象
指向const对象的指针可以指向普通对象,但普通的、非const对象的指针不可以指向const对象,因为可以通过指向普通对象的指针修改指向对象的值,而const对象的值是不可以改变的。
const int a=100;
int *b=&a; //error;a的值是不可以修改的,而“*b”是可以修改的
const int *c=100; //error;指向const对象的指针是不可以指向字面值常
量,字面值常量是不可以寻址的
对于指向const对象的指针:
(1) 指向const对象的指针必须是const限定的
(2) const限定的指针指向的对象可以是const对象,也可以是非const对象
(3) 不能通过const限定的指针去修改所指向的对象
const指针
const指针-----本身的值不可以修改
int a=100;
int *const b=&a; //b是一个const指针,是一个指向int型的const指针
与其他const量一样,const指针的值是不可以修改的,即b的值是不可以修改的,b必须在定义时初始化要指向的对象,b不可以再修改为指向其他对象的指针。b的值不能修改,但是可以通过指针来修改a的值,即通过给“*b”赋值可以改变a的值。
const指针能否通过指针来修改所指向对象的值取决于所指向的对象是否允许修改。那么,指向普通的、非const对象是可以通过const指针修改该对象的值,而指向const对象的const指针是不可以通过指针来修改对象的值。
指向const对象的const指针
指向const对象的指针必须具有const特性,即必须被const限定,所以指向const对象的const指针是这样定义的,
const double pi=3.1415926;
const double *const pi_ptr=π
指针变量pi_ptr是const指针,必须初始化,而这个指针又是指向const对象的指针,所以不允许修改指针的指向,也不允许通过指针修改所指向对象的值。
最后补充一条:
const int *a;//定义指向const对象的指针a
int const * a;//定义指向const对象的指针a
int *const a=&b;//定义const指针a,必须初始化
const *int a;//错误的定义方式
第一条与第二条语句是等价的,都是定义指向const对象的指针;第三条语句是定义const指针,必须在定义的时候初始化;第四条语句是错误的定义方式。