1. 指向const对象的指针
形式如下: (const 修饰的是int *, const 放在类型前和类型后的效果是一样的)
const int *ptr;
或
int const * ptr;
特点:
1) 指针所指的对象是常量, 不能被改变.
2) 指针本身并不是常量, ptr的值可以改变(即可以指向其他对象)
注意1, 非const指针不能指向const对象(const int *不能被转换成int *), 以下代码将产生编译错误:
const int i = 5;
int *ptr;
ptr = &i;//error, cannot convert from 'const int *' to 'int *'
注意2, void *指针不能保存const对象的地址, 而应该使用const void*类型的指针保存.
const int i = 5;
int j = 4;
void *vp;
const void * cpv;
vp = &i; /* error: cannot convert from 'const int *' to 'void *' */
cpv = &i; /* ok */
cpv = &j; /* ok */
注意3, const指针可以指向非const对象(可以将int *转换成const int *), 但不能通过此const指针改变其所指的对象
int i = 5;
const int *ip;
ip = &i; /* ok */
*ip = 4; /* error: l-value specifies const object */
换句话说, 编译器认为, const指针所指向的对象均为const对象, 故不能修改const指针所指的对象.
应用: 常用做函数的参数
2. const指针
形式如下:
int i;
int * const ptr = &i;
以上代码中, ptr是指向int型对象的const指针.
特点:1) const指针本身是一个常量.
2) const指针定义时必须被初始化.
3) const指针一但初始化后, 不能被修改, 即使是赋回同样的值.
int i = 8;
int *const ptr = &i;
ptr = ptr; /* error: l-value specifies const object(左值是常量) */
注意1, const修饰的是指针, 该指针所指向的对象能否修改, 要看int *前面是否有const修饰符.
3. 指向const对象的const指针
形式如下:
int i = 8;
const int *const ptr = &i;
特点:
1) 指针不能被修改
2) 指针所指向的对象也不能被修改
参考: 《C++Primer中文版》第4版 人民邮电出版社 Page110-112