引用是怎么存在的

lyrzhlgq 2006-09-06 05:37:46
我看了一些关于引用的解释,不过其中有一条说引用是alias,不会在内存中有自己的空间,这是引用和指针的区别之一。不过实在不明白,就指针来说,它是在内存中有一个32位的空间存储指针的内容。那么对于这个引用不需要存储空间来存储这个引用,那么它是怎么用的呢。
比如说:
int a = 5;
int &b = a;
int *p = a;
那么,p有自己的存储空间,难道b就没有吗,如果没有它是怎么实现调用的。不会说和#define 一样在编译的时候处理的吧。
...全文
215 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
blue_zyb 2006-09-06
  • 打赏
  • 举报
回复
To:houdy(致力于图像/图形领域,成为有思想的程序员)
实在不明白 引用有什么好处,需要出现这个东东呢。
==================================================
以下文字摘自"高质量C++/C 编程指南":

实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”
这东西?
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?
如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,
以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如
果把取公章的钥匙交给他,那么他就获得了不该有的权利。
blue_zyb 2006-09-06
  • 打赏
  • 举报
回复
To:wanfustudio(雁南飞)
(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。
===================================================================================
什么叫不能建立数组的引用,下面这个不就是数组的引用?!
int ar[10];
int(&rar)[10] = ar;
haoahua 2006-09-06
  • 打赏
  • 举报
回复
引用就是一变量的别名,对引用的操作 == 对 该变量 一样
飞哥 2006-09-06
  • 打赏
  • 举报
回复
我已经把那个文章放到我的blog里面了

有兴趣的可以取看看
houdy 2006-09-06
  • 打赏
  • 举报
回复
oops, 引用是对象==>引用不是对象
飞哥 2006-09-06
  • 打赏
  • 举报
回复
http://www.quickviews.net/data/2006/0421/article_16391.htm
http://www.quickviews.net/data/2006/0421/article_16391_1.htm
只贴一小段
引用简介

  引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

  引用的声明方法:类型标识符 &引用名=目标变量名;

  【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名

  说明:

  (1)&在此不是求地址运算,而是起标识作用。

  (2)类型标识符是指目标变量的类型。

  (3)声明引用时,必须同时对其进行初始化。

  (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

   ra=1; 等价于 a=1;

  (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

  (6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。
houdy 2006-09-06
  • 打赏
  • 举报
回复
实在不明白 引用有什么好处,需要出现这个东东呢。
>>>
引用是对象,所以引用必须初始化,没有初始化的引用编译都不通过。引用定义后,就不能在引用其他的对象。所有通过引用的操作都是对所引用的对象的操作。
指针本身是一个对象,需要占用一定的内存空间。指针作为一个对象,它的值是可以随时变化的。
飞哥 2006-09-06
  • 打赏
  • 举报
回复
楼主,俺回来拿分了
 (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
blue_zyb 2006-09-06
  • 打赏
  • 举报
回复
int a = 1;
int &b = a;
a = 10;
b = 11;
以下是VC6.0下上面代码的汇编:
13: int a = 1;
004013D8 mov dword ptr [ebp-4],1
14: int &b = a;
004013DF lea eax,[ebp-4]
004013E2 mov dword ptr [ebp-8],eax
15:
16: a = 10;
004013E5 mov dword ptr [ebp-4],0Ah
17: b = 11;
004013EC mov ecx,dword ptr [ebp-8]
004013EF mov dword ptr [ecx],0Bh
lyrzhlgq 2006-09-06
  • 打赏
  • 举报
回复
众位大虾,这好像是2种答案呀,blue_zyb你确定在汇编的时候把地址存了起来的吗,如果这样好像和指针的区别就不太大了吗,那么对于一个函数
func(int &a);
func(int *a);
就没有什么实质性的区别了,除了在函数中使用a的时候需要使用*的区别了。
实在不明白 引用有什么好处,需要出现这个东东呢。
===========================
bruceteen(周星星) ( ) 信誉:100 Blog 2006-09-06 17:39:00 得分: 0


就是在编译时啊


============================
wanfustudio(雁南飞) ( ) 信誉:100 Blog 2006-09-06 17:40:00 得分: 0


没存储空间吧
blue_zyb() ( ) 信誉:100 Blog 2006-09-06 17:57:00 得分: 0


可我查汇编(VC6.0, VS2005)好像是把引用对象的地址存了起来





blue_zyb 2006-09-06
  • 打赏
  • 举报
回复
可我查汇编(VC6.0, VS2005)好像是把引用对象的地址存了起来
飞哥 2006-09-06
  • 打赏
  • 举报
回复
没存储空间吧
bruceteen 2006-09-06
  • 打赏
  • 举报
回复
就是在编译时啊

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧