2 lmikic Lmikic 于 2018.03.09 10:22 提问

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
johnnyjyh   2018.03.09 13: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。

johnnyjyh
johnnyjyh 你好,补充一下, const T & 这个类型的初始化 可以接受,常量左值,非常量左值,右值对其初始化。更具体的,看一下《C++11新特性解析和应用》的第三章,左值和右值的相关内容,里面有很不错的解释!
4 个月之前 回复
johnnyjyh
johnnyjyh 回复Lmikic: 你好,前者你加上 const 初始化后,表示限定你的引用修改原值,而后者,你要把const 与指针 当作一个整体去理解,一个限制修改指针所指内容的 类型,这样的引用,也需要用 这样的类型初始化。直接使用临时变量,和使用指针与引用,是有区别的,要特别小心
4 个月之前 回复
Lmikic
Lmikic (不好意思,以为回车是换行,没想到发送出去了):非常感谢您的回答!您的回答解决了我绝大部分的疑问,还有个疑问想请教下:比如, int a = 1; const int &b = a; //这里就可以,而不需要变量a是常量。在const int *&p3 = p; 中const限定内容,这样想错在哪?
4 个月之前 回复
Lmikic
Lmikic 非常感谢您的回答!您的回答解决了我绝大部分的疑问,还有个疑问想请教下:比如, int a = 1;
4 个月之前 回复
baidu_30233079
baidu_30233079   2018.03.09 10:38

*&p3 = p,这个个人认为从功能上可以理解为 **p3 = &p; p的地址&p是非const的,所以报错。

weixin_39925598
weixin_39925598   2018.03.09 14:58

规定。常引用可以绑定到右值上面。右值的主要问题是没注意修改以后的值会丢掉,常引用本来也不能修改,所以没有这个问题。

qq_40277555
qq_40277555   2018.03.09 16:35

常引用可以绑定到右值上面。右值的主要问题是没注意修改以后的值会丢掉,常引用本来也不能修改,所以没有这个问题

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
error:关于const变量来初始化数组
为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? const int n = 5; int a[n]; 答案与分析: 1)这个问题讨论的是“常量”与“只读变量”的区别。常量,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译
const int *p 和 int* const p 的区别详解
const int * p : const右边接近于int这个类型声明,意思是有个指针p,指向的是一个int型的整数常量。即p可变,*p不可变。 int * const p(或int const *p): const右边接近于*这个类型声明,意思是有个指向整数的常指针。即p不可变,*p可变。
操作系统课程设计-页面置换算法
float fifo( const int userMem, const int pageAddrStream[] ); //先进先出的算法 float lru( const int userMem, const int pageAddrStream[] ); //最近最久未使用算法 float opt( const int userMem, const int pageAddrStream[] ); //最佳淘汰算法 float nru( const int userMem, const int pageAddrStream[] ); //最近未用算法 float lfu( const int userMem, const int pageAddrStream[] ); //最近最少使用算法 int main() { cout<< "*******************************************************************************"<< endl << " 操 作 系 统 课 程 设 计 实 验 三 ( 页 面 置 换 算 法 )
补位函数RSA_padding_add_PKCS1_type_1等
补位函数 int RSA_padding_add_PKCS1_type_1(unsigned char *to, int tlen, const unsigned char *from, int flen); int RSA_padding_check_PKCS1_type_1(unsigned char *to, int tlen, const unsigned char *from, int flen, int num); int RSA_padding_add_PKCS1_type_2(unsigned char *to, int tlen, const unsigned char *from, int flen); int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen, const unsigned char *from, int flen, int num);
class中static const int的使用
传统认识我们都知道,对于class 中static const int 的变量,可以在类中进行初始化,并省去外部的定义,向下面的这种方式;此时,编译,执行均是正确的。class test { static const int tmp_int = 1; public: void print() { printf("%d", tmp_int); // foo(tmp_int);
const int *a int * const a区别实例
const int *a int * const a 区别 外加实例
int * const *, const int * const *, const int **
1. 必须先明确的概念:char const * 等价于 const char * 2. int * const * 能修改一级指针指向的内容(一级指针类型为int *),但不能改变一级指针。可以理解为(int *) const * 即 const (int *) * ,(类比char const * 即 const char *,不能改char;同理此处不能改int *,不过可以改int *指向的内容) 3. const int * const * 不能修改一级指针指向的内容(一级指针类型为const
数据结构----迷宫
#include <iostream.h> #include <conio.h> const int m = 9; const int n = 9; const int maze[m+2][n+2] = {{0,0,0,0,0,0,0,0,0,0,0},
int const, const int *,int *const,int const *const 区别
今天做了一个题,关于这个问题。const int a =1 / int const a=1变量a的值不能改变const int *a=&amp;amp;b指针变量a指向的值不能改变int * const a=&amp;amp;b指针的指向不能改变int const  *const a=&amp;amp;b指针指向不能改变,指向的值也不能改变很多人分享了一个经验,就是如果const 位于*的左侧,则const就是用来修饰指...
C语言实用小程序修订版
char lc(const char ch); char uc(const char ch); int max_int(); int min_int(); void swap1(int *x, int *y); void swap2(int *x, int *y);