const的指针和引用

在之前的博客中,简要介绍了c语言和c++中const的用法和不同点,今天给大家详细介绍一下const与指针、引用、形参列表以及返回值相结合的用法。

一、const与指针结合

  1、const int a=10;

      int *p=&a;//  error

    原因:const修饰的是变量a,所以a是一个常量,不可修改,但是可能通过*p操作修改a的值,所以错误

  2、const int a=10;

     const int *p=&a;//  true

    原因:a是常量,*p也无法操作,也就不能改变a的值

   3、 const int a=10;

     int *constp=&a;//  error

    原因:a是常量,第二个式子中,const修饰的是p,意思是p指向a的内存块的指向不变,不能有int b=20;p=&b操作,但是可以通过*p改变a的值,所以错误

   4、const int a=10;

         const int *p=&a;

         int **q=&p;//  error

       原因:可以通过*q改变p的值,**q改变a的值,但是a和*p都是不可变的

   5、int a=10;

        int *const p=&a;

        const int **const q=&p;//  true

      原因:**q和q无法操作,但是可以操作*q,进而改变p的值,也可以通过*p改变a的值

   6、int a=10;

      int *p=&a;

      int *const *q=&p;//  true

      原因:const修饰的是*q,意味着通过*q间接修改p是不能操作的,但是直接修改p是可以的,这两者是不冲突的

   const与二级指针相结合的时候,如果是直接操作,则没有问题。如果是间接操作,则存在风险,需要避免这种风险

  二、const与引用结合

   1、int a=10;

      int &b=a;//  error

     原因:在底层,int &b=a就相当于int *b=a,如果操作&a,就错误了,常量没地址

   2、const int a=10;

      int &b=a;//  error

     原因:a之前有const修饰,不可变,但是可能通过b修改a的值,所以错误

   3、const int a=10;

      int const &b=a;//true

      原因:因为&不参与类型,所以const修饰的是b

   4、const int &b=10;//  true

      原因:在底层,不是直接对立即数取地址,而是先将立即数的值存入临时变量,然后将临时变量的地址传给b

   5、int a=10;

      const int &b=a;// true

      原因:const int &b=a就相当于const int*b=&a,const修饰的是*b

   6、int a=10;

      int *const q=&a;

      int *&p=q;// error

      原因:可以通过*p修改q,但是在第二个式子中q是不可改变的,所以错误

  总结:

  普通引用      引用     普通变量

  普通引用      引用     常量    //错误

  普通引用      引用     立即数  //错误

  常引用        引用    普通变量/常量

  常引用        引用     立即数

三、const与指针、引用、返回值的结合

1、int sum()

{

   int tmp=10;

   return tmp;

}

int main()

{

    int &b=sum();//错误 被调用函数的返回值是一个立即数,而且是由一个寄存器带回的,不能对立即数取地址

    const int &b=sum();//正确  加了const之后变成了常引用

    return 0;

}

2、int* sum()

{

    int tmp=10;

    return tmp;

}

int main()

{

    int *const &p=sum();// 正确

     return 0;

}



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值