一、数据类型对const而言是透明的。
例如:
const int a = 100;
int const a = 100;
const可以放在数据类型的两侧,两者是等价的。
二、const 用于封锁直接修饰的内容,并将该内容的属性变为只读
例如:
1、 int const*p1 = &a;
2、 p1 = &a; //正确
3、 *p1 = 200; //错误
语句 1 : const 直接修饰 *p1 ,所以 *p1以后不能作为左值存在
即 p1之后不能再进行解引用了。
该语句导致:只能修改指针p1指向的地址,不能改变该地址保存的值
语句2 : 正确
语句3 : 错误,*p1 不能做左值
1、 int *const p2 = &a;
2、 p2 = &a; //错误
3、 *p2 = 200; //正确
语句 1 : const 直接修饰 p1 ,所以 p2以后不能作为左值存在
该语句导致:只能修改指针p2所指向地址保存的值,不能改变指针p2 指向的地址
语句 2 : 错误,p2 不能做左值
语句 3 :,正确
1、 int const *const p3 = &a;
2、 p3 = &b; //错误
3、 *p3 = 100; //错误
语句 1 该语句导致不能对p3 进行任何修改,因p3 和 *p3 皆不能作为左值
三、权限可以同等或者缩小传递,绝对不能放大传递
例如:
int a = 10; // a 具有读、写两权限
intb = 20; // b 具有读,写两权限
constint ca = 10;
// const 修饰ca使其不能作为左值,即ca只具有读权限,不能对其进行写入
constint cb = 20;
//const 修饰cb使其不能作为左值,即 cb 只具有读权限,不能对其进行写入
int *p = &a;
// 指针p保存a的地址
p= &ca;
//错误,ca只具有读权限,p具有读、写两权限,有可能通过对 p 解引用修改ca的值
constint *cp1 = &a;
//正确,const直接修饰*cp1,使其不能作为左值,所以cp不能解引用,但可以改变cp1所指向的地址
cp1= &b;
//正确
cp1= &ca;
//正确
const int *cp2 = &ca;
//正确。该句导致cp2不能解引用,也就不用担心会通过解引用修改ca的值。
int *const cp3 =&ca;
//错误。该句const直接修饰cp3,cp3不能做左值,但可以对cp3解引用,可能修改ca的值,可ca不能写入,所以错误
const int *const cp4 = &a;
//该句导致cp4和*cp4都不能做左值,cp4不能动了,虽然没什么错误,但也没什么用