Lmikic 2018-03-09 02:22 采纳率: 58.3%
浏览 2439
已采纳

int * 初始化 const int * & -----非常量引用的问题

为什么不能用 int * 初始化 const int * &?
比如:
int * p = new int(1);
我想引用它:
int * &p1 = p; //正确
我不想改变p指向内容的值:
const int *p2 = p; //正确

那把前两个合在一起:
const int *&p3 = p; //非常量引用错误,不明白为什么?
如果限定指针,则可以,如下:
int * const &p4 = p;
又或者:
const int *q = new int(1);
const int *&q1 = q; //正确

有人分析说:p所指内容不是常量,在被指向常量指针p3引用时会生成临时变量,导致左值引用失败,那下面这种情况呢:
int a = 1;
const int &a1 = a; //正确

最后重申下问题:为什么不能用 int * 初始化 const int * &?,即const int *&p3 = p;出现非常量引用的错误的原因。

请多多指教

  • 写回答

4条回答

  • johnnyjyh 2018-03-09 05:57
    关注

    要理解这个问题,有3点需要理解透彻,才能玩得转
    1.指针与引用的含义
    int *p;
    一个指针给出来,就包括了2样东西,指针指向的地址p ,指针自己的地址 &p,
    int &p1=p;
    引用就是变量的别名!p1初始化后,使用p1就是使用p本身

    2.const 常量指针
    const int *p,int *const p,const int *const p
    这三者的不同,第一个指向常量的指针,第二个常量指针,第三个是一个指向常量的常量指针,这三者的区别是:第一个存储的指针可以更改,指针指向的值不能更改,第二个存储的指针不能更改,指针指向的值可以更改;第三个就是两者都不能更改;
    代码描述:
    int a=5;
    int b=6;
    const int *p1=&a;
    *p1=1;报错
    p1=&b;可以
    int * const p2=&a;
    *p2=1;可以
    p2=&b报错
    const int *const p3=&a;
    *p3=1;报道
    p3=&b;报错

    现在回到题主的问题:
    int * p = new int(1);
    

    const int &p3 = p; 错误
    分析: const int *& 这是一个引用,引用的是什么? const int * ,就是一个指向常量的指针
    再来看 int *p 是什么 ,这是一个指向变量的指针
    这样看就清晰了,一个是指向变量的指针,一个是指向常量的指针,在引用初始化看来,根本就是两种生物了!理所应当初始化失败!
    所以const int *& 初始化 就要const int * 类型!
    题主还需要注意的东西, 一个指针 被引用 ,不光指针的指向,指针自己的地址也被引用了!
    可以做做高阶指针与引用的练习,方便你掌握这些内容。比如 const int *
    **& const p。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 flask项目,怎么使用AJAX传数据库数据到echarts图表的data里,实现异步加载数据。
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题