C/C++编程笔记:C++中的指针与引用,又在什么时候使用?

2023-11-05

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

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

指针:指针是一个变量,用于保存另一个变量的内存地址。需要使用*运算符将指针取消引用,以访问其指向的内存位置。 

引用:引用变量是别名,即已经存在的变量的另一个名称。引用(如指针)也通过存储对象的地址来实现。 

可以将引用视为具有自动间接指向的常量指针(不要与指向常量值的指针混淆!),即编译器将应用*运算符。 

差异:  

1.初始化:

指针可以通过以下方式初始化: 

int a = 10;int * p =&a;            

 或者int * p;p =&a;我们可以在同一步骤或多行中声明和初始化指针。

在引用中, int a = 10;int&p = a; //它是正确的  但int&p; p = a; //这是不正确的,因为我们应该一步一步声明和初始化引用。

注意:编译器之间的差异可能有所不同。以上差异是针对Turbo IDE的。

2.重新分配:可以重新分配指针。此属性对于实现数据结构(例如链表,树等)很有用。

请参见以下示例: 

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

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

整数a = 5;int b = 6;int&p = a;int&p = b; //在这一行它将显示错误,因为“不允许多个声明”。但是,这是有效的声明,int&q = p;

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

  int&p = a;  cout <<&p << endl <<&a;

4.NULL值:指针可以直接分配为NULL,而引用则不能。与引用关联的约束(无NULL,无重新分配)确保基础操作不会遇到异常情况。

5.间接:您可以使用指向提供额外级别间接的指针。而引用仅提供一种间接级别。即, 

在指针中整数a = 10;int * p;int ** q; //它是有效的。p =&a;q =&p;而在参考文献中,int&p = a;整数&& q = p; //它是对引用的引用,因此是错误。

6.算术运算:可以对指针执行各种算术运算,而没有所谓的引用算术。(但是您可以像引用&obj + 5那样获取引用指向的对象的地址并对其进行指针算术)。 ) 

何时使用什么

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

使用引用 :在函数参数和返回类型中。

使用指针: 如果需要使用指针算术或传递NULL指针,请使用指针。例如对于数组(请注意,数组访问是使用指针算术实现的)。

由于要指向不同的单元格,因此要实现诸如链表,树等的数据结构及其算法,我们必须使用指针的概念。

C ++ FAQ Lite中引用:可以使用引用,而必须使用指针。每当您不需要“重新放置”时,通常首选使用引用而不是使用指针。这通常意味着引用在类的公共接口中最有用。引用通常显示在对象的外观上,而指针则显示在对象的外观上。 

上面的例外是函数的参数或返回值需要“reseating”引用,即不引用对象的引用。通常最好通过返回/获取一个指针,并赋予NULL指针特殊的意义来完成此操作(引用必须始终是别名对象,而不是取消引用的空指针)。 

每天学点小知识,希望对你有帮助~

另外如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!笔者这里或许可以帮到你~

C语言C++编程学习交流圈子【点击进入】微信公众号:C语言编程学习基地

分享(源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++编程笔记:C++中的指针与引用,又在什么时候使用? 的相关文章

随机推荐

  • idea前端可视化_jsp可视化开发工具_netbeans jsp可视化_idea 可视化开发 jsp

    数字生态钜惠来袭 秒杀 2核4G 5M带宽 1200元 3年 1核1G首购 99元 年 把默认改成 myeclipse jsp editor 原默认的jsp编辑器是 myeclipse visual jspdesigner 顾名思义 此编译
  • linux ALSA & ASOC(1)—— framwork

    一 ALSA framwork 涉及文件 函数 sound core sound c snd register device for dev 创建次设备 sound core init c snd card create 创建contorl
  • java自定义注解

    Java自定义注解的步骤如下123 使用 interface关键字定义注解 注解的成员参数只能是基本类型 String Class Enum Annotation或者它们的数组 使用元注解 Target Retention Document
  • chatgpt赋能python:如何用Python计算居民用电量

    如何用Python计算居民用电量 介绍 居民用电量是一个重要的经济指标 对于一个家庭来说 如果能够掌握自己的用电量情况 不仅可以控制开支 还可以提高用电效率 节约能源 而对于电力公司来说 了解居民用电量的变化规律 可以更好地调节电力供给 提
  • tomcat设置线程数

    查看Tomcat线程数 1 Tomcat默认线程数200 2 修改server xml文件 增加maxThreads minSpareThreads maxSpareThreads acceptCount 3 参数解释 maxThreads
  • 股指期货的基差为负值说明什么(股指期货的基差为负值说明什么问题)

    期货基差低于全年基差是什么意思 简单说期货基差的意思就是现阶段某个期货价格和现货价格之间的差价 基差 现货价格 期货价格 基差为负值 说明现货过多 此时现货价格小于该商品的期货价格 基差为正值 说明当市场商品供应出现短缺 供不应求时 现货价
  • AD20/Altium designer——如何从立创EDA获取元器件封装库原理图库PCB库

    1 打开并登录立创EDA 找到需要的元器件 2 导出原理图 PCB封装文件 1 导出原理图封装 2 导出PCB封装 与上述导出方法同理 2 打开AD20软件 1 新建原理图库和PCB元件库 2 将刚下载的文件拖入AD内打开 3 复制白嫖元器
  • 使用vsomeip遇到的一些问题

    1 接口设计 在编写fdepl文件时 要先写attribute 在写method 再写broadcast 不能像fidl文件 穿插着写 否则编译不过 2 在运行程序时 有时候会遇到无法连接的问题 需要把 tmp vsomeip 0 这一系列
  • 宏定义中有浮点数_算法笔记

    2 9 2浮点数的比较 由于计算机当中采用有限位的二进制编码 因此浮点数在计算机当中的存储并不总是精确地 例如在大量的计算以后 一个浮点类型的数3 14在计算机当中可能存储成3 1400000000001 也有可能存储成3 13999999
  • 动态NFT的构建、部署和出售

    原文地址 NFT是只有在区块链领域里才存在的工具 有着广泛的应用和机遇 ERC721代币标准可以构建收藏品 独立代币 票据 游戏等多种应用 对于那些想要参与构建的开发者来说 一个动态和随机的NFT是一个很好的开始 但我们现在可以用它做什么
  • 【机器学习实战】11、利用SVD简化数据

    文章目录 14 1 1 隐形语义索引 14 1 2 推荐系统 14 2 矩阵分解 SVD矩阵分解 14 3 利用python实现SVD 14 4 1 相似度计算 14 4 2 基于物品的相似度还是基于用户的相似度 14 4 3 推荐引擎的评
  • 【数据挖掘】数据清洗

    什么是数据清洗 数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序 包括检查数据一致性 处理无效值和缺失值等 与问卷审核不同 录入后的数据清理一般是由计算机而不是人工完成 数据清洗的步骤 缺失值的处理 无效值的处理 统一规格 纠正错
  • 断点续传与差分升级

    断点续传的原理 基于STM32单片机的差分升级 增量升级 算法 OTA 差分升级 云端一体化差分升级 AliOS Things物联网升级 利器 详解STM32在线IAP升级 单片机差分升级算法 STM32 M0 M3 M4等芯片都适用 Al
  • 【DICOM医学影像1】数据格式存储于显示,基本知识科普指南

    DICOM Digital Imaging and Communications in Medicine 数据格式 是医学影像存储中的标准格式 无论是X光 CT 还是MRI等等影像 采集的原理不同 但是存储的格式一般都是统一的 本文就对DI
  • 杂记——4.书写spring时出现的Error creating bean with name ‘user0‘ defined in file错误

    目录 1 问题描述 2 情况描述 3 解决方法 4 问题原因 1 问题描述 当我们运行一个spring程序时 出现下图的错误 重点语句 Error creating bean with name user011 defined in fil
  • 腾讯在线教育互动课堂——Demo调试过程记录

    官方文档地址 https cloud tencent com document product 680 17888 Demo调试 不像集成使用 不需要完全按照文档一步步处理 基本的代码 集成在下载下来的demo项目上都已经写好了 以下记录以
  • 550种Blender风格化笔刷素材

    550种Blender风格化笔刷素材 550 Blender刷风格化版 包括4K阿尔法 大小解压后 3G 信息 一个伟大的自定义风格化的刷子使用Blender收集 Alphas包含在其他软件中使用 ArtStation MEGAPACK 5
  • 小程序中 rich-text 显示富文本

    在使用 rich text 来显示fuwq富文本时需要注意后台返回的数据是一个网页转义字符 直接使用rich text的话是无法正常解析的 那么需要使用下面的一个方法进行反转义即可 小程序里的转义方法 escape2Html functio
  • More Effective C++

    链接 https pan baidu com s 1oIns7Z7CWD6zAz17IFImWw 提取码 4stq Scott Meyers大师Effective三部曲 Effective C More Effective C Effect
  • C/C++编程笔记:C++中的指针与引用,又在什么时候使用?

    C和C 支持与大多数其他编程语言不同的指针 其他语言包括C Java Python Ruby Perl和PHP 从表面上看 引用和指针非常相似 都用于使一个变量提供对另一变量的访问 两者都提供了许多相同的功能 因此通常不清楚这些不同机制之间