原文地址:& 引用 取地址作者:beter

引用实际上就是给同一个变量取了多个名字。  
  举个例子:  
  有个人的名字叫a,之后又改名叫b,这时a和b都是指这个人,这样b就引用了a,即b就是a。

int  
&a  
=  
b;   
........1  
 int  
*a  
=  
&b;  
........2  
 在1的情况下,  
只分配了b的空间  
 在2的情况下,  
分配了a和b的空间

引用是C++的叫法  
取地址是C的叫法

简单说:  
 
引用,需要一个对象  
 
取地址,不用。  
   
 
另:把引用说是指针,也不为过。其区别可以这么说  
 
引用不能改变,指针可以改变。  
 
引用有安全机制检查,指针没有。

引用的2大作用:

1)作为函数的参数,用于提高效率(如常量入参,返回类的成员变量的值)、返回数据...

作为函数的参数,用于提高效率这里主要是指用类实例作为参数,因为如果不是用引用,也不使用指针,

那么在参数的传递过程中,将有一个隐含的调用类的构造函数的操作,也就是说将构造一个新的类作为参数,
使用引用将避免这个过程,如果担心类中的成员被修改,那么可以再加上const修饰符

2)简化代码,使代码易读。如:  
         
要使用a->b->c->d->e->f->g,g是一个多重嵌套类中的一个整数成员,书写很麻烦,也容易错。

这时:  
         
int  
&z  
=a->b->c->d->e->f->g;

以后直接使用z,因为他们的存贮单元本来一致,所以也根本没有效率的损失。

--------------------------------------------------------------------------------------------------

//------------>怎样理解引用的作用和意义.
你是否感觉:&在几个用法中没有一致的性质可循.
下面我们就来探讨和总结一下:

#include <iostream>
#include <stdio.h>

using namespace std;

void main(void)
{
   
//测试引用是否可以赋以常量.
   
   
   
//考察引用和指针的使用区别
   
   
   //测试对引用取址返回的结果
  
  
   //测试是否可以重新赋值
  
   
   
//说明引用的一种错误用法..........
   
   
   
   
   
//测试引用和指针混合的情况...
       
typedef char* PChar;
       
typedef char& RChar;
       
typedef PChar& RPChar;

PChar str = "I am programming.";

RPChar rpchar = str;
       
cout<<str<<endl<<rpchar<<endl;

getchar();
}
*/

/***********
/*结论:对于int& a;引用实际是一种隐式指针,是方便编程而引入的,识别由编译器支持
.
       
在函数的使用中.可把它理解为跟后面的结合. int (&a);
       
在传递参数的过程中跟取地址值意思差不多.
/*    
而在函数内部使用过程中则相当与数值.你可把它看作便利的原因.其实引用&
/*     
是一个能自动被编译器逆向引用的常量型指针
总结:     
...
/*  A.常规使用:
/*                   
1.   int a = 100;
/*                        
int &b = a;
/*                   
2.   int a = 100;
/*                        
int &b = a;
/*                        
int &c = b;
/*                   
3.   int a = 100;
/*                        
int &b;  //必须定义时赋值,不同于指针(int a =
100;
/*                                   
// int *p; p =&a;) 
/*                        
b = a;
/*                   
4.   int &a =
100; //不可将常量赋予引用...

/*                        
const int& a = 100;//可行,作全局看
/*                   
5.   int a = 100;
/*                        
int &b = a;
/*                        
cout<<&b<<endl;
//输出的是a(也是b)的地址..而不是指针
/*                                                  
// 的地址...
/*                   
6.   int a = 100;
/*                        
int &b = a;
/*                        
int
*ptr;

/*                        
ptr = &a;
/*                        
cout<<a<<b<<*ptr<<endl; 
//结果是一样的..注意*ptr.
.
/*                   
7.   int a =100;
/*                        
int b = 200;
/*                        
int &c = a;
/*                        
c =
b;     
//引用可重新赋值...........
/*

/*B.较难的使用规则:
/*                   
1.   系列错误用法:
/*                                      
char* str = "I am programming.";
/*                        
定义引用数组:int& a[3]; (定义指针数组:int* a[3];
)
/*                        
定义引用的指针:int&* a; (定义指针的指针:int** pt
r;
/*                        
定义引用的引用:int&& a;
/*                   
2.   可定义指针的引用: 
int*& a = str;  //When it must

/*                        
be initialized when definedv. 
/*

/*C.引用在函数和对象域的使用
/*                   
1.  做函数返回类型的应用:(当然传递的参数类型为引用,那么

/*                       
是地址传递方式...)
/*                        
int arr[3] = {1,2,3}; 
/*                        
fook(2) =
100;   
//函数返回的是引用,做左值时,编译

//器将其当作地址使用....
/*                                          
//而如返回的是常量,那当然不可
                                             
//赋值

/*                        
int& fook(int index){ return (arr[index]+1);}
/*
/*                   
2.返回局部变量
/*                        
int& fook(param){
/*                             
int m = 100;
/*                                
return m;
/*                                        
}
/*                        
//在函数结束生命周期后,返回的地址将不可用.
/*
/*                  
3.不好的对普通对象的引用
/*                    
class MClass;
/*                    
MClass* mcptr;
/*                    
mcptr = new MClass(param);
/*                    
if(!mcptr) MError("Constructing object failed.");
/*                    
MClass& mcref = *mcptr;
/*                    
也许上面的引用可以使你感觉更舒服的使用MClass: 如
/*                     
mcref.function();而不必
/*                    
(*mcptr).function();或mcptr->function();
/*                    
可是相比之下,一个严重的问题来了:内存泄露..
/*                    
因为引用不像指针那样明显:你很可能忘记:delete &mcref;

/*
/*                 
4.对对象相关的参数的引用

/*                   
void
fook(param1)

/*                   
{
/*                            
param->function(noramlparam);
/*                   
}
/*                   
上面的程式中,我想传递一个对象的地址,从而使用对象的成员函
/*                   
数..怎么办?
/*

/*                   
void fook(MClass* mcpptrparam){};
/*                   
恩,可以.

/*                   
用一用:
/*                   
MClass mcptr = new MClass(param);
/*                   
fook(mcptr);
/*                   
还有呢:
/*                   
MClass mcobj;
/*                   
fook(&mcobj);
/*
/*                   
当然你也可:
/*                   
void fook(MClass& mcrefparam){};
/*                   
这样引用的对象可在全局数据区、堆栈、栈
/*                 
5.当然引用真的就是为了方便吗?.......
/*                   
其实正如它在函数返回值里的应用,可由编译器识别为地址,在作
/*                   
为对象相关参数的
/*                   
引用里亦存在同样的好处,指针的引用可替换指针的指针,多变的
/*                    
工作....

http://blog.sina.com.cn/s/blog_46b7d6050100tvwn.html

[转载]& 引用 取地址的更多相关文章

  1. [转载]C++中 引用&与取地址&的区别

    一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用.     例如: int &rf; // 声明一个int型的引用r ...

  2. 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)

    一.初步了解--指针与取地址 先看程序: #include<cstdio> int main(void) { int num = 7; int *p = &num; printf( ...

  3. C++中 引用&与取地址&的区别

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  4. C++中引用与取地址

    所谓引用就是为对象起一个别名.例如变量b = &a,b就是a的一个引用.对b的任何操作等同于对a的操作,也就是说,如果你改变了b的值,同时a的值也会发生改变.b就是a的另外一个名字,他们实质是 ...

  5. 取地址与解引用 C指针浅析

    C语言指针入门需要掌握的两个概念就是取地址&和解引用*,下面我们按例子来理解这两个符号的使用. int main() { int a = 0; int* pa = &a;//取地址操作 ...

  6. 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

    这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ------------------------------------------------- ...

  7. c语言 &取地址运算符的理解

    对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回当时声明p 时开辟的地址:但是根据我对代码的观察,我觉得&运算符不只是返回地址的功能: 例如: in ...

  8. C语言的数组名和对数组名取地址

    http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针, ...

  9. WCF 在VS中,添加服务引用,地址输入http://ip/Service.svc,点击前往,提示错误,内容如下:

    WCF的service端的webconfig如下: <?xml version="1.0"?> <configuration> <system.ser ...

随机推荐

  1. MyBatis学习总结(八)——Mybatis3.x与Spring4.x整合

    一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:create -DgroupId=me.gacl -DartifactId=spring4-myba ...

  2. dedecms代码研究六

    今天讲的是dedecms最关键的东西,模板分析啦.也就是dedetag.class.php 里面的ParseTemplet方法 模板解析方法 先看看一个dedecms标签,大家心里有个数: {dede ...

  3. boost的线程池和内存池 智能指针

    内存池为boost自带的 #include <boost/pool/pool.hpp> 或者另外一个开源的库: nedmalloc 一个高效率的库 线程池需要下载另外一个开源库 http: ...

  4. 【EF学习笔记05】----------操作内存中的数据

    SingleOrDefault实验 //SingleOrDefault实验 using (var db = new Entities()) { var classes = new Classes() ...

  5. 第五百七十八、九天 how can I 坚持

    这样下去不行啊 ,昨天晚上回来捣鼓了一晚上手机,看个视频还经常开小差,得全力以赴了,不能抱着打酱油的心态了,加油. 今天和yj聊了聊,好多事啊,不能一心工作了,还得考虑结婚,也是醉了. 努力吧,先把考 ...

  6. 样式link属性media用法--媒体类型查询

    引用外部样式使用link 你可能想针对将要显示页面的设备类型(桌面PC.笔记本电脑.平板电脑.手机或者甚至页面的印刷版本)来调整页面的样式,可以利用一个media属性, 在<link>元素 ...

  7. EAS linux挂载数据盘

    查看数据盘名称 fdisk -l 假设没有挂载的数据盘为/dev/xvdb 格式化数据盘 mkfs.ext3 /dev/xvdb 添加自动挂载 mkdir /data echo '/dev/xvdb ...

  8. java基础十[包、Jar存档文件和部署](阅读Head First Java记录)

    将Java的class文件生成为可执行的Java应用程序.Java应用程序有三种:完全在本机执行的Jar(例如本机的GUI可执行程序):完全在服务器端远程执行的(例如浏览器来进行存取):介于两者之间的 ...

  9. iframe自动适应高度1

    js: function iFrameHeight() { var ifm= document.getElementById("iframepage"); var subWeb = ...

  10. Java NIO教程 Selector

    这次我们开讲非阻塞I/O中的Selector,它需要配合非阻塞的TCP和UDP来使用.首先我们先简单讲一下TCP和UDP的非阻塞通道. 非阻塞I/O通道 在上代码前我们先讲解一些最基本的知识.TCP和 ...