笔者介绍:姜雪伟,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. python16_day09【Select多路复用】

    一.select多路复用 句柄列表11, 句柄列表22, 句柄列表33 = select.select(句柄序列1, 句柄序列2, 句柄序列3, 超时时间) 参数: 可接受四个参数(前三个必须) 返回 ...

  2. 利用开源的TaskScheduler组件实现监控和管理windows计划任务

    对于计划任务的执行有很多种解决方案,如利用开源Quartz作业调度框架,在SQL Server的作业等等,同时Windows的任务计划程序功能也很强大,利用此可以很方便的实现很多计划任务,除了人工进行 ...

  3. LeetCode:组合总数II【40】

    LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...

  4. UEditor文本编辑器

    Ueditor是由百度web前端研发部开发所见即所得的编辑器,具有轻量,可定制,注重用户体验等特点.Ueditor基于BSD开源协议,除了具有代码精简.加载迅速的轻量级特质 外,还采用了分层理念,使开 ...

  5. Codeforces Round #395 (Div. 2) D. Timofey and rectangles

    地址:http://codeforces.com/contest/764/problem/D 题目: D. Timofey and rectangles time limit per test 2 s ...

  6. gc摘要

    1. Sun JDK 1.6 GC(Garbage Collector) http://bluedavy.com2010-05-13 V0.2 2010-05-19 V0.52010-06-01 V0 ...

  7. 【转】Matlab使用过程中内存不足问题的总结

    使用matlab过程中经常会出现内存不足的问题,这里转载一篇来自http://blog.csdn.net/xiaojidan2011/article/details/8089532 的博文,解决这一问 ...

  8. 20145201 《Java程序设计》第一周学习总结(修改)

    # 20145201 <Java程序设计>第一周学习总结 ## 教材学习内容总结 万事开头难,终于开始学习了Java.寒假的时候看到老师的要求确实有点慌,但是这周翻开书,从书本知识第一行学 ...

  9. setState详解

    我们都知道,React通过this.state来访问state,通过this.setState()方法来更新state.当this.setState()方法被调用的时候,React会重新调用rende ...

  10. 用adb 启动camera

    adb shell am start -a android.media.action.STILL_IMAGE_CAMERA  启动camera adb shell input keyevent 27 ...