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

 

 

 

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

相关文章推荐

温习C/C++笔记(2)——指针和引用的区别

首先看一段代码以及运行结果,我将结合该段代码讲解指针和引用的两点区别: // // main.cpp // testC++02 // // Created by fei dou on 12...

C或C++中函数的参数传递——值传递、指针传递、引用传递

C或C++中函数的参数传递包括:值传递、指针传递、引用传递这三种方法 先看源代码,编译环境是vc6.0,因为调试方便。功能是要实现a和b值的交换。 // test.cpp : Defines ...

读thinking in java的收获(一)——java中的引用,c++引用与c指针的区别与联系以及java的数据类型

学了一年的java了,磕磕碰碰的成长,今天买了一本thinking in java,刚读前两章就发现有很多知识上的遗漏点,现总结如下。 读到第二章的第一节"用引用操纵对象"突然就懵了,结合查阅的一些资...

C/C++——跟我重写智能指针auto_ptr模版类

C/C++——跟我重写智能指针auto_ptr模版类

C/C++——this指针

本文主要给读者介绍一下this指针,理解this指针能更方便的开发程序,特别是在面向对象的可视化编程中,如MFC。用好this指针能在程序开发中起到事半功倍的效果。...

C/C++程序设计——指针基本概念

在计算机系统中,无论是存入或是取出数据都需要与内存单元打交道,物理 器件通过地址编码寻找内存单元。地址编码是一种数据,C语言的指针类型正是为 了表示这种计算机所特有的地址数据。通过指针间接访问内存...

C/C++程序设计——指针与函数

在一个函数内部用指针访问代替对象直接访问、代替数组和字符串访问,实际意义并不大。指针最重要的应用是作为函数参数,它使得被调函数除了返回值之外能够将更多的运算结果返回到主调函数中,即指针是函数参数传递的...

自增与指针取值运算符——C/C++运算符优先级表

++和--的运算优先级比*高。 #include #include void printa(int * a) { printf("a[]:"); int i; for(...

初学c/c++——浅谈指针

1.指针在我初学指针的时候,其实感觉指针和数组有点相似,但是其实两者有着本质上的区别。数组信息在传递给函数,必须要有长度信息,比如:    int avg( int* p , int len){{}...

C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)

问题引入:比如:如果我们想在父类的构造函数中调用虚函数,当定义子类对象的时候,父类的构造函数中的虚函数执行的是子类中的函数。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++——引用和指针
举报原因:
原因补充:

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