在《C++ primer》第56页中详细写了,const double *p是指向常量的指针,double *const p是常量指针,const double *const p是指向常量变量的常量指针。同时也讲了这种复合类型的辨析最好的方法是从右向左阅读。
1. const double *p
const double pi=3.14; //pi是个常量,它的值不能改变
double*ptr=π //错误:ptr是一个普通指针
const double *cptr=π //正确:cptr可以指向一个双精度常量
*cptr=42; //错误:不能给*cptr赋值
该段代码说明对于一个普通类型常量pi,指向它的指针cptr也必须是指向常量的指针,形式为const double *ptr,书中将其称为底层const,指向的数据类型与定义时写的数据类型有关。
double dval=3.14;//dva1是一个双精度浮点数,它的值可以改变
const double*cptr=&dval;//正确:但是不能通过cptr改变dval的值
指向常量的指针不是必须指向常量,如果指向一个普通变量dval,仅仅是无法通过该指针cptr改变指向的变量。
【注意】普通常量必须初始化,但是指向常量的指针可以初始化也可以不初始化。这并不冲突,因为指向常量的指针这个指针本身不一定是常量,可以不初始化,double *const p这种形式的指针才是常量,即必须初始化。
2. double *const p
int errNumb=0;
int *const curErr = &errNumb;//curErr 将一直指向errNumb
double *const p常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。把*放在const关键字之前用以说明指针是一个常量,这样的书写形式隐含着一层意味,即不变的是指针本身的值而非指向的那个值。
书中将其称为顶层const,可以指向任何数据类型。
3.const double *const p
const double pi=3.14159;
const double*const pip=π//pip是一个指向常量对象的常量指针
const double *const p是一个指向常量对象的常量指针。它指向的对象是一个常量,这是由第一个const所确定的,指针本身是一个常量,这是由第二个const所确定的。