1.const定义:const修饰一个变量,那么这个变量从此以后就不可以做左值。
左值:放在赋值等号的左边,用到写权限(常量不可以做左值、地址不可以做左值、临时量不可以做左值)
2.在【C语言】中的const(基于c89环境)
1)在C语言中const修饰的变量不一定要初始化,但之后被修饰的量是不可以作为左值的。
2)准确来说,在C语言中,const修饰的量被叫做常变量,不可以叫做常量。
3)被修饰的量不可以直接被当作常量来使用,例如定义一个数组的大小。
4)被修饰的量在编译过程中和普通变量是没有区别的。
3.在【C++】中的const
1)在C++中const修饰的变量必须要初始化、初始化后不可作为左值。
2)在C++中被const修饰的量叫做常量。
3)在编译过程中,直接将常量的名字替换为常量的值(在取常量的值时),所以在C++中被const修饰的量,可以用来当作常量数字来使用,例如:定义一个数组的大小。但是需要注意,如果是取常量的地址,那么就不能直接替换为常量的值了。
4).如果修饰的量的初始化值是一个变量,那么此时C++中的常量的意义就等同于C语言中的常变量
int a = 10;
const int b = a;
4.const和一级指针的结合
1)const修饰的是离它最近的类型,基本数据类型对const透明。
int a = 10;
const int *cp1 = &a;//离const最近的类型是int 那么就是修饰int的内容,也就是*cp1不可作为左值
int const *cp2 = &a;//离const最近的类型是int 那么就是修饰int的内容,也就是*cp2不可作为左值
int* const cp3 = &a;//离const最近的类型是int* 那么就是修饰int*的内容,也就是cp3不可作为左值
int const *const cp4 = &a;//离第一个const最近的类型是int,*cp4不可作为左值、离第二个const最近的类型是int*,cp4不可以作为左值。
2)为了保证const的安全,在代码上不可以有直接(让常量作为左值)或间接(泄露了常量内存的地址或者引用,ps:绝对不可以将常量的地址或引用泄漏给普通的指针和普通的引用变量)修改一个常量的可能。
const int a = 10;
a = 20;//常量不可以直接作为左值
int *p = &a;//常量的地址不可以传给普通的指针
int &b = a;//常量不可以传给普通的引用
const int *p1 = &a;//*p1不可作为左值 是安全的
3)权限可以同等传递或缩小传递,但是不可以放大传递。
4)const和多级指针结合时需要多加注意。