指向常量对象的指针与常量指针,两者在表达方式及作用意义上有什么不同?
const int *count;
int const *pInt;
两者有什么不同呢?
一. 指向常量的指针
const int *count; 实际表示count 所指向的对象是int 型的常量对象,它意味着不能通过该指针来间接地修改任何它所指向的对象,不论该对象本身是否为const 型;但它同时也意味着指针本身可以被修改。对于这种类型的指针,正确的作用方法有:
1. 对于一个const 类型的对象,必须通过一个指向const 对象的指针来指引。即:
const int i;
int *pInt = &i; // 编译错误
const int *pInt = &i; // 对了
2. 对于一个非const 类型的对象,也可以通过一个指向const 对象的指针来指引,这样就不能通过指针来间接地修改该对象。即:
int i;
const int *pInt = &i;
*pInt += 5; // 将导致编译错误。因为pInt 所指向的对象已经被编译器认为是const 的,所以不能再被修改。
这种用法,最常见在函数参数的传递上。为了确保作为参数所传递的某个指针所指向的对象在函数内部不被修改时,就可以将该指针参数声明为这种类型。
3. 可以修改这个指针本身,即它可以继续指向别的地址。
const int *pInt = &a;
pInt = &b; // 这是允许的
二. 常量指针
int a;
int *const pInt = &a; // 这里pInt 就是一个常量指针
常量指针,也其实也就是一种常量对象。它不能被修改,即不能再指向其它地址;但它所指向的对象的值,可以被修改。由于常量指针本身是种常量,因此在它被定义时就必须初始化。
*pInt++; // 是正确的
int b;
pInt = &b; // 错了
不过说实在,常量指针的确不太常用,它的使用价值确实很小。
三. 指向const 对象的const 指针
int i;
const int *const pInt = &i;
这里pInt 就是一个指向const 对象的const 指针。在这种情况下,pInt 所指向的对象的值,及它本身所指向的对象,都不能被改变。
对于const 的修饰作用,一个总的原则就是:如果要强调某个对象是const 型,就应该让const 尽量地靠近这个对象。
在const 对象与非const 对象之间,可以进行类型的转换。这其实又涉及到数据类型转换方面的话题,这可以作为一个话题单独说说。