详谈const 与指针 引用 (二)

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和引用指针的结合

★:引用在定义时必须进行初始化。(为什么呢?)

例:

猜你喜欢

转载自blog.csdn.net/genzld/article/details/83957565