0. 指针与引用
指针是对象,即在内存中占有实际内存。而引用只是一个对象的别名,本身不占有实际内存,不是对象。所以指针本身也可以是常量,指针也可以指向常量,下面区分一下。
1. 指向常量的指针(pointer to const)
指向常量的指针不能用于改变所指对象的值。
const double pi = 3.14;
const double *cptr = π // 正确
double *ptr = π // 错误
要想存放常量对象的地址,只能使用指向常量的指针!但和常量引用一样,指向常量的指针所指向的对象可以不是常量!
也就是说,所谓指向常量的指针只是它自己觉得,它指向的是一个常量,所以自觉地不去改变所指向对象的值。但所指向的对象可以通过其他方式去改变。
这也就是为什么定义函数时,在函数内部不会改变的形参尽可能的定义为指向常量的指针或者常量引用!这样会提高函数的灵活性,即也可以接受常量参数,也可以接受非常量参数。否则就不能接受常量参数,比如字面值和const对象。(《C++Primer 第5版》p192)。而且,如果把函数不会改变的形参定义为普通引用,会给调用者一种误导,好像函数可以修改它的实参的值一样,毕竟普通引用形参做参数可以改变实参的值。
2. 常量指针(const pointer)
指针本身也可以是常量,常量指针必须初始化,一旦初始化完成,它的值即存储的地址,就不能改变了。
int i = 0;
int * const p = &i; // 正确:p 将一直指向i
int m = 0;
p = &m; // 错误!
const int n = 0;
int * const q = &n; // 错误。原因参考1. pointer to const