《C++ Primer Plus》第五版 P200~P202
两种不同方式将const关键字用于指针。第一种是让指针指向一个常量对象,可以防止使用该指针来修改所指向的值。第二种是将指针本身声明为常量,可以防止改变指针指向的位置。
int age=39;
const int *pt=&age;
声明一个指向常量的指针pt,pt指向一个const int(39),因此不能使用pt来修改来修改这个值。即*pt的值为const,不可以被修改。
*pt=20;//不合法
cin>>*pt;//不合法
注意:pt的声明并不意外着它指向的值时间就是一个常量,而只是意外着对pt而言这个值是常量。例如pt指向age,而age不是常量。可以通过改变age变量来修改age的值,但不能使用pt指针来修改它。
age+20;//合法
注意:将const变量的地址赋给指向const的指针可行,将const的地址赋给常规指针不可行。
尽可能使用const
将指针参数声明为指向常量数据的指针原因如下:
1)可以避免由于无意间修改数据而导致的编程错误;
2)使用const使得函数能够处理const和非const实参,否则将只能接受非const数据。(如果条件允许,则应将指针形参声明为指向const的指针)
int age=39;
const int *pt=&age;
const只能防止修改pt指向的值,而不能防止修改pt的值,即可以将新地址赋给pt。
int sage=80;
pt=&sage;
但是仍然不能使用pt来修改它指向的值。
使用const方式使得无法修改指针的值:
int sloth;
const int *ps=&sloth;//a pointer to const int,不允许使用ps来修改sloth的值,但允许ps指向另一个位置
int * const finger=&sloth;//a const pointer to int,finger只能指向sloth,可以用finger来修改sloth的值
声明指向const对象的const指针
double trouble=2.0E30;
const double *const stick=&trouble;
其中,stick只能指向trouble,而stick不能用来修改trouble的值。简而言之,stick和*stick都是const。
通常,将指针作为函数参数来传递时,可以用const指针来保护数据。