const 的主要作用是利用编译器帮助我们检查自己代码的正确性用const在代码中标示出“不应该改变”的地方,然后利用编译器检查这些地方是否真的没有被改变过,如果我们不小心修改而来这些地方,编译器就会报错
const在C和C++中的区别
- C中,const修饰的量可以不用初始化,它本质上不是常量,叫常变量,不能当做常量使用如
const int a = 10;
int arr[a];
它不能作为左值被修改,但可以通过指针操作内存更改它的值
- C++中,const修饰的量必须初始化,叫常量,可以用来定义数组的大小
- 编译方式不同,c中,const就是当做一个变量来编译生成指令的
- C++中所有出现const常量名字的地方都被常量的初始值替换了
注意被const修饰过的量,不可以在做左值
不能把常量的地址泄露给一个普通的指针或普通的引用变量
const和一级指针的结合
const修饰的是离他最近的类型
const int *p //修饰的是int 则*p不可被修改
int const *p//修饰的是int *p不可被修改
int * const p//修饰的是int* p=&a不可被修改
const int *const p//*p 和p 都不可修改
const 的右边如果没有指针的话,const不参与类型
int * <=const int * //不可把常量地址泄露给普通指针
const int *<=int * //是可以的
const和二级指针的结合
int a = 10;
int *p = &a;
int **q = &p;
const int **q;//修饰int ,**q不能修改
int *const *p;//修饰的是int* *p不能修改
int** const p;//修饰的是int ** p不能修改
const int**<=int ** //是不对的
int **<=const int **//是不对的
const和指针引用的结合
用一句代码在内存的0x0018ff44处写一个4字节的10
int *p = (int *)0x0018ff44;
int *&&p=(int *)0x0018ff44
const int *&q=p=>const int **q=&p//是不对的