《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指针来保护数据。