/*
已知声明:
const int v2=0;//顶层
int v1=v2;//变量
int *p1=&v1, &r1=v1;//p1:指向整型变量的指针,r1绑定到整型变量的引用
const int *p2=&v2, *const p3=&i, &r2=v2;//p2:指向整型常量的指针,底层const;p3:指向整型变量的常量指针,顶层+底层;r2:绑定到整型常量的引用,底层const。
练习2.31:下面的语句哪些是合法的,说明顶层const和底层const在每个例子中有何体现
r1=v2;
//r1, 绑定到整型变量v1的引用, v2整型常量
//等价于:v1=v2;合法。
//顶层const不受影响
p1=p2;
//p1, 指向整型变量的指针,p2, 指向整型常量的指针,类型不一致,不合法
//p2具体有底层const资格,p1没有底层const资格,p2是常量,无法转换成非常量。
p2=p1;
//p2指向整型常量的指针,允许指向非常量对象。合法。
//底层const资格不同,p1指向非常量,可以转换成常量
p1=p3;
//p3具有底层const资格,指向常量,不能转成非常量。
//不合法
p2=p3;
//p2,p3,具有相同的底层const资格,p3的顶层const不影响
//合法。
//执行拷贝操作时,常量是顶层const,不受影响。拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型能够转换。一般来说,非常量可以转成常量,反之则不行。
*/