const int a = 10; int *p = &a; //会报错,常量地址不能泄露给指针 // 左:int* 右:const int*
const在C++中,修饰的常量不能作为左值,在编译过程中所有出现常量的地方都会用初始值替换。
const修饰的量常出现的错误是:
const int *p; //const修饰*p,指针可以修改指向的int类型内存,但不能间接修改指向的值 int const* p; //同上面的情况 int *const p; //const修饰p本身,不能修改指向的内存,但可以通过指针解引用修改指向的值 const int *const p; //上面的情况结合,不能修改指向内存,不能通过解引用修改指向的值
const 修饰的是离它最近的类型
总结const 和指针类型转换公式:
int a = 10; const int *p = &a; //p此时是 整型常量 的 地址 int *q = p; //错误,类型不同,和a没有关系
int *q1 = nullptr; int *const q2 = nullptr; //q2本身是个常量,不能当左值用 cout<<typeid(q1).name<<endl; //int* cout<<typeid(q2).name<<endl; //int*
常见三种方式:
int main(int argc, char const *argv[]) { int a = 10; int *p = &a; const int **q = &p; //const int** <= int** 错误 /* q - 表示这块内存本身的值 *q - 指向的一级指针的值 **q - 指向的一级指针指向的变量的值 */
转换公式:
int** <= const int** 转换错误
const int** <= int** 转换错误
int** <= int * const* 转换错误,这是const 和一级指针的结合(主要看const和右边的指针
int* const* <= int** 可以转换
const 和二级指针结合的时候 ,const是绝对不能省去的