4. C++ const与多级指针

1. const

const修饰的变量不能再作为左值

1.1 C 和 C++ const 的区别
  • C 中const修饰的量可以不用初始化。不属于常量,而是常变量
  • C++ 中的const必须进行初始化,如果用常量初始化则是常量,如果用一个变量名初始化则是常变量
  • C 和 C++中const的编译方式不同,C 中const被当作一个变量来编译生成指令,C++中出现const的地方都会被常量的初始值替换。
1.2 const和一级指针的结合

const修饰的量常出现的错误:

  • 常量不能再作为左值;
  • 不能把常量的地址泄露给一个普通的指针或普通的引用变量,可以间接修改;
  • const如果右边没有指针*的话,const不参与类型,就是普通的指针类型,没有const属性;
// C++语言规范:const总是修饰离他最近的类型(离p最近还是离int最近)
const int* p;       // const修饰的是整形int,*p不能被赋值(为什么不是int*,因为int可以单独组成一个类型)
int const* p;       // const修饰的是int(因为p和const隔了一个*, *不是一个类型)
int* const p;       // const修饰的是int*,不是const int*,const如果右边没有指针*的话,const不参与类型
const int *const p; // 前一个const修饰int,后一个const修饰int*

// const int*与int*的类型转换,多级指针的情况下,两边必须都有const  
// const int* <= int* yes
// int* <= const int* No
// int** <= const int* No
// const int ** <= int** No
int a = 10;
int* p = &a;
const int*p1 = &a;  // const int* <= int*
int* const p2 = &a; // int* <= int*, p2也是int*
1.3 const和二级指针的结合
int a = 10;
int* p = &a;
const int** q = &p // 错误 两边必须都有const ,不能把常量的地址泄露给一个普通的指针:改正 const int* p = &a 
    
const int** q;     // const修饰的是int,**q不能被赋值,q和*q都可以被赋值
int* const* q;     // const修饰的是int*,*q不能被赋值,q和**q都可以被赋值
int** const q;     // const修饰的是int**,

你可能感兴趣的:(C++知识,c++,java,javascript)