当前位置:
首页
文章
后端
详情

C++ 中的指针与引用:最终指南

指针在C ++是保存另一个变量的存储器地址的变量。引用是一个已经存在的变量的别名。一旦引用被初始化为一个变量,它就不能被更改为引用另一个变量。因此,引用类似于 const 指针(不要与指向常量值的指针混淆!)。

主要区别

指针

  • 指针在声明后,无论何时都可以初始化为任意值。
int a = 5;
// some code
int *p = &a;
  • 可以分配一个指针来指向一个NULL值。
  • 指针需要使用 ​*​.
  • 指针可以改为指向相同类型的任何变量。

例子:

int a = 5;
int *p;
p = &a;
int b = 6;
p = &b;

参考

  • 引用被声明时必须进行初始化。
int a = 5;
int &ref = a;
  • 引用不能是NULL.
  • 可以简单地按名称使用引用。
  • 一旦引用被初始化为一个变量,它就不能被更改为引用一个变量对象。

其他差异

内存详情

指针在堆栈上有其自己的内存地址和大小,而引用共享相同的内存地址(与原始变量),但也占用栈堆上的部分空间。

算术运算

可以对指针执行各种算术运算,而没有称为引用算术的东西。(但可以取一个引用指向的对象的地址,然后像在​&obj + 6​中那样对它进行指针运算)。

指针和引用在什么时候使用

性能完全相同,因为引用在内部实现为指针。但是仍然可以记住一些要点来决定什么时候使用什么:

使用参考:

  • 在函数参数和返回类型中。使用指针:
  • 如果需要指针运算或传递 NULL 指针,请使用指针。例如对于数组(请注意,数组访问是使用指针算术实现的)。
  • 要实现链表、树等数据结构及其算法,因为指向不同的单元格,我们必须使用指针的概念。

正如C++ 官方常见问题解答中所说:

可以时使用引用,必要时使用指针。

当你不需要“重置”时,引用通常优先于指针。这通常意味着引用在类的公共接口中最有用。引用通常用在对象的外观上,指针用在内部。


上述的例外情况是,函数的参数或返回值需要一个“sentinel”引用—一个不引用对象的引用。这通常是通过返回/获取指针,并赋予nullptr值这种特殊意义(引用必须始终别名对象,而不是取消引用的null指针)来实现的。


注意:老 C 语言程序员有时不喜欢引用,因为它们提供的引用语义在调用方的代码中并不明确。然而,经过一些C++体验,人们很快意识到这是一种信息隐藏的形式,它是一种资产而不是责任。例如,程序员应该用问题的语言而不是机器的语言编写代码。



免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型