1.将变量变成只读
定义一个变量a,并赋初值10,变量a既可以被重新赋值,又可以被读取:
int a= 10;
a = 20;
int b = a;
这时变量a被称为左值,它具有可以被赋值和读取两种属性
倘若定义常变量a,试着重新赋值和读取:
可以看到编译器报错,const将变量a变成了右值,即只可被读取,不能写入(重新赋值)
2. 数据类型对于const而言是透明的
观察1,const写在int后面,那么数据类型是否会影响const的作用?:
显而易见,数据类型不会影响const
3. const修饰它的直接右边,不能做左值
int a = 10;
int b = 20;
const int * p= &a;
p = &b; //指针变量p做左值,被重新赋值为b的地址,说明const并没有对指针p作用
*p = 30; //由于数据类型对于const是透明的,所以const作用于*p,可以看到*p不能做左值,因为它不能被重新赋值
int * pp = &a;
*pp = *p; //可以看到被const修饰的变量,不能再做左值,只能用来被读取
4.权限可以同等或者缩小传递,但不能放大传递
const int b = 20;
const int *p = &b; //同等传递:此时b不能做左值,*p也不能做左值,倘若int * const p,则是错误的,因为*p是可以做左值的,这样的话b的值可以被修改,因此不合法
const int * const p = &b; //缩小传递:p和*p都不能做左值,这样就保证了b的值不会被修改
int * const p = &b; //放大传递:这种传递是不合法的,因为const修饰指针变量p,但是*p可以做左值,可以修改b的值