Q1:引用是别名,引用必须初始化。为什么必须被初始化呢?
Q2:将地址运算符作用于引用:
#include <iostream>
using namespace std;
int main()
{
int a=2;
int& r_a=a;
cout<<"&a="<<&a<<endl;
cout<<"&r_a="<<&r_a<<endl;
return 0;
}
运行结果:
&a=0x22ff74
&r_a=0x22ff74
请按任意键继续. . .
我们看到,引用的地址与引用指向的变量的地址是一样的,但这应该这样解释:&r_a==&a,即引用变量在任何时候都代表引用指向的变量,故输出的地址一样是合情合理的。《21天学通C++》中指出,C++并没有提供获取引用变量本身地址的办法,因为获得引用变量的地址毫无意义。这至少说明,引用确实在另外一个地方占据了一块内存,只是我们没法获得那块内存的地址。(ps:当然,从应用的角度来看,也没必要、也不应该获得其地址,否则在有指针的情况下,引用的引入完全没有必要了。)
但是,我还是想搞清楚,引用和引用指向的变量的内存布局到底是什么样的呢?
Q3:我们不妨把C++中函数参数的传递方式分为两种:1、按值传递 2、按引用传递
其中,按引用传递又可细分为:(1)使用指针按引用传递 (2)使用引用按引用传递
我们知道,使用指针按引用传递,传递的是一个地址,那么问题来了:使用引用按引用
传递,传递的到底是个什么玩意儿呢?
如:
#include <iostream>
using namespace std;
void swap(int& a, int& b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int x=5,y=10;
swap(x,y);
cout<<"after swap: x="<<x<<" y="<<y<<endl;
return 0;
}
Q4:引用不能为空(必须初始化),现在要想让引用指向在堆中开辟的一块内存,保险起见,可以这样:
int* pInt=new int;
if(pInt!=NULL)
int& rInt=*pInt; //从这看,引用又是个什么东西呢?
引用这个问题困扰我很久很久了,希望在这里能得到解答。
如果哪位兄台在网上哪个地方或者那本书上发现有讲得好的,不妨推荐一下,多谢了。
转自:http://student.youkuaiyun.com/space.php?uid=48778&do=thread&id=6872
这几天一直在思考一些问题,就是引用变量在一些教材上的说法是一个变量的别名,那么引用变量本身是否占用空间呢?
比如说:(本人使用的是vc++6.0编译器)
int a = 10;
int & r = a;
cout << &a << endl;
cout << &r << endl;
从上面的例子当中可以看出:它们得出的结果是相同的,这时便会有人说,r和a所占用的内存空间是相同的,因为打印出来的地址是相同的。所以这些教材上对于引用变量的操作,称之为声明一个引用变量,而非定义。因为教材的编写者认为引用变量并不占用空间。
但是,如果你使用调试器调试一下,看一下汇编的代码,就会产生新的迷惑了。
00401040 push ebp
00401041 mov ebp,esp
00401043 sub esp,48h
00401046 push ebx
00401047 push esi
00401048 push edi
00401049 lea edi,[ebp-48h]
0040104C mov ecx,12h
00401051 mov eax,0CCCCCCCCh
00401056 rep stos dword ptr [edi]
5: int a = 10;
00401058 mov dword ptr [ebp-4],0Ah
6: int & r = a;
0040105F lea eax,[ebp-4]
00401062 mov dword ptr [ebp-8],eax
从这段汇编代码来看,r和a的空间并不相同,那这又怎么解释呢?
基于此,我得出了一个非常合理的解释:
如果定义(我认为引用变量占用空间,故称之为定义)一个引用变量,这个时候引用变量实际上在内存中已经申请了一个空间,是4个字节的(32bit系统中),它本身和指针是相同的。也就是说引用和指针对于编译器本身来说操作是相同的,只是对于用户来说操作不同而已。
接下来又会有人问:那么为什么上面程序的结果打印出来的地址是相同的呢?
其实这只是编译器给你的假象而已。当你将r引用给了a,当想要打印&r的时候,编译器会自动将其引用的对象的地址打印出来,也就是将a的地址打印出来,这也就是它们打印结果相同的原因了。
注:以上的解释都是本人的研究结果,并没有经过官方的证实,如果哪为网友对此有新的看法,不吝赐教,非常感谢!
转自:http://blog.youkuaiyun.com/gmcxsqjh/archive/2009/01/06/3719552.aspx