笔者介绍:姜雪伟,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. image_Magic图片处理功能

    :] 来自为知笔记(Wiz)

  2. 自己写的一个简单PHP采集器

    自己写的一个简单PHP采集器 <?php //**************************************************************** $url = &q ...

  3. maven的相关命令

    maven的相关命令 mvn archetype:create :创建 Maven 项目 mvn compile :编译源代码(编译到target文件夹中) mvn test-compile :编译测 ...

  4. Kattis - pizzahawaii 【状态标记】

    Kattis - pizzahawaii [状态标记] Description You are travelling in a foreign country. Although you are al ...

  5. 【leetcode刷题笔记】Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  6. Python3:数字类型和字符串类型的相互转换

    Python3:数字类型和字符串类型的相互转换 一.python中字符串转换成数字 方法1: 类中进行导入:import string str='555'num=string.atoi(str)num ...

  7. pxe-kickstart批量部署文档

    #PXE安装: yum install syslinux xinetd tftp-server httpd -y yum install dhcp -y yum install system-conf ...

  8. 20165114 《网络对抗技术》 Exp0 Kali安装与配置 Week1

    目录: 一.kail的下载与安装 二.kali的网络设置 三.安装vmware-tools. 四.更新软件源. 五.共享文件夹 六.安装中文输入法 一.kail的下载与安装 VMware workst ...

  9. Android 相关重难点知识整理

    [原文] 集合 对 HashMap 进行排序: HashMap 本身无序,但其子类 LinkedHashMap 使用链表结构,实现了有序.通过 HashMap#entrySet() 方法可以将 Map ...

  10. 常见linux系统中RPM包的通用命名规则

    本文重点说一下在常见的linux系统中,RPM包通用的命名规则. RPM包的一般格式为:name-version-arch.rpmname-version-arch.src.rpm 例:httpd-2 ...