const修饰的对象不能变!!!
一:const与一级指针
int* p1 = &a; | int * q1 = &a |
const int *p2 = &a | const int * q2 = &a |
int * const p3 = &a | int* const q3 =&a |
使用情况判断:
一组:
p1 = q1 | int* -> int* √ :int* -> int* |
p1 = q2 | const int* -> int* × :const int* -> int*//const修饰的是类型是int,修饰的对象是*p,//这样会丢失const性 |
p1 = q3 | int *const -> int* √ :q3的类型是int* const(也就是说:品的任何变化不能改变q3的指向。这是成立的) |
二组:
p2 = q1 | int* -> const int * √ :将无限制的传给有限制的肯定可以 |
p2 = q2 |
const int* ->const int* √ :相同类型可相互赋值 |
p2 = q3 | int * const -> int* √ :同上 |
三组:
q3 = p2 | const int* -> int* const × :①const修饰的数据对象是 *p2 ②修饰的数据对象是q3。所以*q3可变,这样就改变*p2了。 ① ② |
例如:
int c = 10;
const int *s = &c;//const int * 类型:*s不能变
int *const p = s; //int* const 类型:p的指向不能变
*p = 100;//错误的。!!
注意:
const 只有在修饰的内容中有*,才参与数据类型。
即:
int fun(int* a,int* b); | 参数列表(int * , int *); |
int fun( const int *a , const int *b); | ( const int * , const int * ); |
int fun( int * const a,int *const b); | ( int * , int * );//由于const修饰的内容中无* |
二:const和二级指针
做法:①先判断能否去掉*(const 修饰的类型中有*,可以对星号进行等式两边的删除),②若为2级指针,则判断双向问题。
int **p1 = &b; | int **q1 = &b |
const int **p2 = &b | const int **q2 = = &b |
int *const *p3 = &b | int *const *q3 = &b |
int **const p4 = &b | int **const q4 = &b |
使用情况判断:
p1 = q2 × | const int ** -> int ** :将有限制的给无限制的赋值显然错误。 |
p1 = q3 × | int * const* -> int ** :可删除修饰类型中的*。int const *->int*,理由同上。 |
p1 = q4 √ | int **const -> int **:可删除修饰类型中的**: int const-> int 自己举例子。 |
p2 = q1 √ | int ** -> const int ** :不可以删除,正向:但是将无限制的给有限制的显然是正确的,反向:同上 |
p2 = q3 × | int * const * -> const int **:不可删除,正向:①保证*q3不变;②是**p2不变,*p可以变。 ① ② |
p2 = q4 × | int **const -> const int **:不可删除,正向:①保证 q4指向不变②保证**p2不变。但是p2任何变化都不会干扰到q4指向 ① ② 逆向:**q4的改变会 改变**p2,所以错误。 |
三:const和引用指针的结合
★:引用在定义时必须进行初始化。(为什么呢?)
例: