C/C++——引用和指针

引用是C++引入的新语言特性,是C++常用的一个重要内容之一,指针是C/C++的一大特色,正确、灵活地使用引用和指针可以使程序简洁、高效,同时这也是程序开发的一个难点,故在本篇中我将对引用和指针进行讨论,并在函数参数传递中对两者进行总结,希望读者能对引用和指针的使用有更深刻的认识。

 

1.     引用

引用是一个变量的别名,对引用的操作与对变量直接操作完全一样。

如:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名。此时变量ra和变量a有相同的地址,它们两是同一个变量,并没有对ra开辟内存空间。对任意一个变量操作都会影响另一个变量。ra=1; 等价于 a=1;

 

2.     指针

指针是一个变量的存储单元对应的地址,保存了存储这个变量在内存中的物理地址。所以有了这个地址,可以通过指针运算符 * 访问存储在这个地址的变量的值,也可以用取地址运算符访 &问这个变量的地址。

在给出引用和指针的概念后,这里总结一下指针和引用的相同点和不同点:

★相同点:

(1)都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名;

(2)指针和引用都是和具体的数据类型相关联的,如 int * a; 和int &b; 指针与引用都是和相同数据类型的变量关联的;

(3)引用在语言内部通过指针实现;可以把引用理解为const指针,并且可以通过这个指针修改变量的值。

★不同点:

(1)引用不能为空,指针可以为空;

(2)指针是一个实体(占内存空间),而引用仅是个别名(不占内存空间);所以对引用和指针使用sizeof得到的是所指向的变量(对象)的大小和指针本身的大小;

(3)引用只能而且必须在定义时被初始化,之后不可变(从一而终);指针可以先定义而不初始化(只是比较危险),后面可以改变指向的对象(见异思迁);

(4)不能建立引用数组,但可以建立指针数组,表示这个数组里装的都是地址;

(5)指针的自增(++)运算表示物理地址自增,指向连续内存的下一个单元,引用的自增(++)运算表示变量的值自增;

(6)不能建立引用的引用,但可以建立指向指针的指针,或多重指针。

 

指针是变量的地址,引用实质上也是地址,程序开发中可以通过指针与引用间接访问其他对象。那么如何决定在什么时候使用指针,什么时候使用引用呢。

(1). 如果认识到在任何情况下都不能用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量,该变量在某些时候也可能不指向任何对象(NULL)或需要能够在不同的时刻指向不同的对象,这时你应该把变量声明为指针。

(2). 如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。而指针在使用前,最好应该检查它的合法性。

 

3.     函数参数传递

函数参数传递分为值传递、指针传递和引用传递

值传递方式是最简单的参数传递方式,会重新开辟内存复制实参,如果传递的是对象,还将调用拷贝构造函数。形参成为实参的副本,然后实参和形参脱离关系,所以值传递不具备反向影响实参的能力。

引用传递的目的主要在于能保证参数传递中不产生副本,提高传递的效率解决大块数据或对象的传递效率和空间问题,以从这种意义上讲,在c++中进行参数传递时优先使用引用传递而不是指针。引用传递,传递的是实参的地址,形参实参指的是同一个变量,对引用的操作就是对目标变量的操作,因此形参可以影响实参。

指针传递比引用传递更为复杂一些,虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要使用指针运算符 “*指针变量名” 的 形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。

从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。这也是为什么指针传递既可以改变实参,又可以不改变实参。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的,所以引用传递可以改变实参的值。

 

 

参考文献:

http://blog.csdn.net/thisispan/article/details/7456169

http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html

http://blog.csdn.net/listening_music/article/details/6921608

http://blog.chinaunix.net/uid-21411227-id-1826834.html

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值