顶层:指针本身就是一个常量。
底层:指针所指的对象是一个常量。
指针类型既可以指顶层const,也可以是底层const,这一点和其它类型相比区别明显。
int i =0;
int *const p1 = &i; //不能改变p1的值,因为这是一个顶层const
const int ci =42; //不能改变ci的值,因为这是一个顶层const
const int *p2 =&ci; //允许改变p2的值,因为这是一个底层const
const int *const p3 = p2; //靠右边的是顶层const 左边的是底层const
cosnt int &r = ci; //用于声明引用的const都是底层const
当执行拷贝操作时,顶层const不收影响,底层const的限制很多
int *p = p3; //错误,p3包含底层const的定义,而p没有
p2 = p3; //正确,P2和p3都是底层cnost
p2 = &i; //正确, int*能转换成 const int *
int &r = ci; //错误,普通的int&不能绑定到int 变量上
const int &r2 = i; //正确,const int &可以绑定到一个普通int上
p3既是顶层const也是底层const,拷贝p3时可以不在乎它是一个顶层const,但是必须清楚它指向的对象得是一个常量。