int a = 1;
const int b = 2;
const int *pa = &a; //正确,可以指向非常量
pa = &b; //正确,指向可以改变
*pa = 1; //不能通过常量指针修改所指对象的值
指针常量,因为指针是个常量,而不是类型是常量,因此有下面的规则:
只能指向于非常量,不能指向于常量(因为放置指针常量修改常量的值)
不可以改变指针常量的指向,因为指针自身是个常量
int a = 1;
const int b = 2;
int c = 3;
int* const pa = &a; //正确,a是非常量
int* const pb = &b; //错误,b是常量
*pa = 10; //正确,可以修改指向对象的值
pa = &c; //错误,不能修改pa的指向(因为指针自身是个常量)
常量指针常量,有如下规则:
可以使用常量、非常量赋初值
不能改变值、不能改变指向
int a = 1;
const int b = 2;
const int *const p1 = &a; //正确
const int *const p2 = &b; //正确
*p1 = 2; //错误
p1 = &b; //错误
之间的转换
转换的规则是:非常量可以转换为常量,反之不行
int i = 0;
int j = 0;
const int ci = 42;
const int *p2 = &ci;
int *const p1 = &j;
const int *const p3 = p2;
p3 = p1; //错误,p3的指向也不能更改
int *p = p3; //错误,p3包含const,而p没有
p2 = p3; //正确,p2和p3都包含底层const
p1 = p3; //错误,p1的指向不能更改