C++中,为什么输出的值不一样(如图)cout<<" r的内存地址:\t\t"<<&r<<endl;

如题所述

第1个回答  2013-07-26
int *&r 定义了一个指针的引用,引用就是别名,对引用进行操作就是对实体本身进行操作,这点在传参的时候能感受得到。
那么r就是指向开辟新空间的一个指针引用,也就相当于指针本身。*r是取指针指向的空间值;r是指针,即就是开辟的空间的地址;r是指针,&r就是指针的地址,即指针的指针,即存储指针的那片内存的地址(而不是指针指向的地址);那么*&r就是存储指针的那片内存的地址里边的内容,即开辟空间的地址。& 这个符号在声明的时候是引用,在其他地方就是取地址符号。
第2个回答  2013-07-26
int *&r ;
这种形式是指针的引用形式,
就是说r是一个指针变量的别名,在这里r就是一个整形指针变量的别名,
因为int *&r = new int ;
这里new int就是在堆区分配一个int类型大小的空间,并返回这个空间的整形指针,
这里的new int返回的指针没有命名,可以看成一个隐藏类型的指针,如果把上边这一句拆开,
就是如下这样的
int *p = new int;
int *(&r) = p;
上边是把这个隐藏指针还原成p,这样可以更好的理解,你参考引用类型的定义说明
所以后边的就很好解释了,
*r = 6;因为r是p的别名,这句话就是*p = 6;
所以第一条输出 *r = *p = 6;

第二条输出是r,因为引用类型只是一个别名,事实上是不存在这个变量的地址的,所有出现p的地方都可以用r来代替,r就是p,这里输出r就是输出指针p,所以001477D8就是指针p中存储的值。(指针变量存储的都是一个地址值,6是001477D8这个地址存储的值)

第三条输出*&r,也就是*&p,(这里的&不是引用的意思,&只有在定义变量的时候才有引用的意思,这里的&是取地址),就是先取p的地址,然后再取这个地址的指向,其实也就是p,所以输出仍然是001477D8。

第四条输出&r,也就是&p,这里的&还是取地址的意思,也就是取p的地址,所以这个值不是001477D8了,是指向001477D8的值,也就是002FF678这个地址的变量。本回答被提问者和网友采纳
相似回答