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

原创 2015年11月20日 18:00:19

引用是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

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

java中的引用和C++中的指针的区别

1.类型:引用其值为地址的数据元素,java封装了的地址,可以转成字符串查看,长度可以不必关心。C++指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。2.所占内存: 引用声明时没有实...
  • b271737818
  • b271737818
  • 2009年02月24日 13:30
  • 8972

面试热门题C与C++的区别-------指针和引用

在面试过程中,C语言和C++的区别总是面试官的侧重点,而指针和引用更是容易被问到,指针和引用的区别很简单,但很少有人能有全面的,有层次有条理的回答这个问题,所以有条理的总结归纳就显得尤为重要。 先来了...
  • z_xiao_xue
  • z_xiao_xue
  • 2016年09月11日 21:34
  • 468

C/C++语言参数传递----值传递、引用传递、指针传递、指针引用传递

1.普通传递 void f( int p){ printf("\n%x",&p); printf("\n%x",p); p=0xff; } void main() { int a=0x10...
  • whzhaochao
  • whzhaochao
  • 2013年10月20日 21:57
  • 12747

c/c++返回值为指针、引用时注意的地方

int *getint() { int p=10; return &p;//提示返回临时变量 } int *getint2() { int *p=(int*)malloc(size...
  • wuhaiwei002
  • wuhaiwei002
  • 2016年04月18日 00:41
  • 2755

C/C++的值传递,指针传值和引用传值的区别

首先让我们来看下面几个代码:
  • zhushh
  • zhushh
  • 2014年11月03日 12:07
  • 2047

C++引用详解及与指针异同点

一、引用详解 引用:就是对某一变量(或对象)取一个别名,对变量的引用 的操作与对变量本身直接操作完全一样。 引用的声明:类型标识符 &引用名=目标变量名;   如下:定义变量a的引用aa,即别名。  ...
  • ljheee
  • ljheee
  • 2016年08月12日 11:22
  • 1143

C/C++值传递、指针传递和引用传递详解

一、实例 //下面5个函数哪个能成功进行两个数的交换?#include using namespace std; void swap1(int p, int q) { i...
  • u014186096
  • u014186096
  • 2015年09月28日 16:50
  • 824

C++中指针和引用的区别(超详细)

指针和引用主要有以下区别: 引用必须被初始化,但是不分配存储空间。指针不声明时初始化,在初始化的时候需要分配存储空间。 引用初始化后不能被改变,指针可以改变所指的对象。 不存在指向空值的...
  • weikangc
  • weikangc
  • 2015年11月10日 17:40
  • 984

C++中引用、指针与const之间的爱恨情愁

学过C语言基础的肯定都知道变量和数据类型是再简单不过的知识,然而这个基础中确有几个泥潭,稍有不慎就粉身碎骨——编程受阻,面试被刷。其中一个就是引用、指针和const,以及相互之间剪不断理还乱的关系。今...
  • xueyushenzhou
  • xueyushenzhou
  • 2016年08月30日 21:59
  • 1844

C/C++ 引用,赋值,指针之间的区别

int a; int *p=&a; a = 15; int &b = a; a = 18; cout b是引用,b也指向a的地址,故当a,b中任意一个值发生变化,则两个一起发生变化。...
  • wujinhao924
  • wujinhao924
  • 2017年03月07日 22:14
  • 819
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++——引用和指针
举报原因:
原因补充:

(最多只允许输入30个字)