笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

C和C ++支持与大多数其他编程语言不同的指针, 其他语言包括C ++,Java,Python,Ruby,Perl和PHP支持引用。

在表面上,引用和指针都非常相似,两者都用于使一个变量提供对另一个变量的访问。 同时提供许多相同的功能,这些不同机制之间的区别往往不清楚, 在本文中,我将尝试说明指针和引用之间的差异。

指针:指针是保存另一个变量的内存地址的变量, 需要使用*运算符来来访问它指向的内存位置。
引用:引用变量是别名,也就是现有变量的另一个名称。 一个引用,像一个指针也是通过存储一个对象的地址来实现的。

引用可以被认为是一个常量指针(不要与一个指向恒定值的指针混淆),具有自动间接,即编译器将为您应用*运算符。

int i = 3; 

// A pointer to variable i (or stores
// address of i)
int *ptr = &i; 

// A reference (or alias) for i.
int &ref = i; 

二者区别:

1、重新分配:指针可以重新分配, 此属性对于实现数据结构(如链表,树等)很有用。请参见以下示例:

int x = 5;
int y = 6;
int *p;
p =  &x;
p = &y;

另一方面,引用不能重新分配,并且必须在初始化时分配。

int x = 5;
int y = 6;
int &r = x;

2、内存地址:一个指针在堆栈上有自己的内存地址和大小,而引用共享相同的内存地址(与原始变量),但也占用堆栈上的一些空间。 引用可以与指针非常相似的方式传递给函数,存储在类中等等。 指针是一个独立变量,可以分配新的地址值; 而引用一旦被赋值,将永远不会引用任何新对象,直到变量超出范围。

3、NULL值:指针可以直接分配NULL,而引用不能。 与引用相关联的约束(无NULL,无重新分配)确保底层操作不会遇到异常情况。

4、间接:您可以指向提供更多间接级别的指针的指针, 而引用仅提供一级间接。

5、算术运算:可以对指针执行各种算术运算,而引用没有称为参考算术的东西(但是可以使用引用指向的对象的地址,并在&obj + 5中进行指针算术运算)。

什么时候使用?

性能完全相同,因为引用在内部实现为指针。 但是,您仍然可以留意一些点来决定何时使用:

注意事项:

使用引用:在函数参数和返回类型中。
使用指针:实现链表,树等数据结构及其算法。
如果需要指针算术或传递NULL指针,则使用指针。 例如对于数组(请注意,数组访问是使用指针算术实现的)。

引用通常都优于指针, 这通常意味着引用在类的公共接口中最有用。

指针和引用在C++中应用的更多相关文章

  1. PyQt(Python+Qt)学习随笔:Qt中的部分类型QString、QList和指针、引用在PyQt中的实现方式

    老猿Python博文目录 老猿Python博客地址 在我们查阅Qt的文档资料时,可以看到Qt中的链表使用的是QList,字符串使用的是QString,但老猿在测试时发现这两个类型PyQt不支持,无法找 ...

  2. C++ 中的指针、引用以及函数调用中的问题

    参考链接:https://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html 函数传参的方式有三种: (1)值传递: (2)引用传递 ...

  3. C++的指针,引用,指向指针的引用和Java中的引用

    #include <iostream> #include<algorithm> using namespace std; class Test { public: Test(i ...

  4. 浅谈C++中指针和引用的区别者之间的区别和用法(转)

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...

  5. 浅谈C++中指针和引用的区别

    指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个 ...

  6. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  7. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  8. 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?

    static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...

  9. C语言中 指针、引用和取值

    指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针 ...

随机推荐

  1. xshell下载安装

    打开网址http://www.netsarang.com/download/software.html 找到最新版的xshell,点击下载 在跳转的页面填写个人信息,许可证类型选择家庭和学校使用,除了 ...

  2. 设置SVN提交日志必填

    1.打开visualSVN Server2.打开Repositories3.右键需要控制的项目->所有任务->manage hooks...4.选择Hooks tab,点击Pre-comm ...

  3. class_options

    一.class_option :stylesheet, :type => :boolean, :default => "true", :description => ...

  4. 102. Binary Tree Level Order Traversal ------层序遍历

      Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to righ ...

  5. HBase在数据统计应用中的使用心得

    转载自:http://www.cnblogs.com/panfeng412/archive/2011/11/19/2254921.html 1. 数据统计的需求 互联网上对于数据的统计,一个重要的应用 ...

  6. Linux设备驱动程序加载/卸载方法 insmod和modprobe命令

    linux加载/卸载驱动有两种方法. 1.modprobe 注:在使用这个命令加载模块前先使用depmod -a命令生成modules.dep文件,该文件位于/lib/modules/$(uname ...

  7. Qt5.5.1移植到freescale imx6

    一.环境 HOST:ubuntu12.04-LTS Embedded:freescale imx6 linux-3.0.35 CROSS_COMPILE:freescale提供的gcc-4.6.2-g ...

  8. zabbix监控nginx的性能

    1.nginx配置 需要使用zabbix监控nginx,首先nginx需要配置ngx_status,在nginx的配置文件中加入红框中的配置,然后重启nginx如下图所示: location /ngx ...

  9. 黑苹果Yosemite 10.10.1懒人版完美安装及简单驱动设置

    1.硬件概要 CPU: 英特尔 Xeon E3-1230 V2 (四核)主板: 技嘉 H77-DS3H (Intel H77 (Panther Point Base))内存: 8 GBytes显卡: ...

  10. PHP的date函数的时区问题

    来自:http://www.cnblogs.com/fuland/p/4250462.html(“腐烂的翅膀”的博客) 从php5.1.0开始,php.ini里加入了date.timezone这个选项 ...