你了解引用和指针的区别吗?

前言:

在计算机编程中,引用和指针是两个重要的概念,它们用于处理内存中的数据。它们在很多编程语言中都有相应的支持,例如C++和C。对于c语言来说,指针是最重要的概念之一,想要学好c语言就难以绕开对于指针的学习。那么对于c++来说,引用这一概念也同样如此。如果对指针还有不太了解的同学可以去看看我的关于指针初阶到进阶的博客,内容非常详细:

C语言内功修炼---指针详讲(初阶)-CSDN博客

C语言内功修炼--指针详讲(进阶)-CSDN博客

1.引用概念

引用是一个别名,它为一个已存在的变量提供了一个额外的名字。引用在声明时必须初始化,并且在其生命周期内始终引用相同的变量。可以理解为给某个变量起一个外号。

 引用的声明

类型& 引用变量名(对象名) = 引用实体

int num = 42;
int &ref = num;//注意,引用必须初始化,且不能修改其引用对象
ref = 55; // 修改ref会影响num

引用类型必须和引用实体是同种类型的


2.引用的特性

1. 引用在定义时必须初始化


2. 一个变量可以有多个引用


3. 引用一旦引用一个实体,再不能引用其他实体

 3.常引用

C++ 中的 "常引用"(const reference)是指在声明引用时使用了 const 修饰符,从而表明引用所指向的值不能被修改。常引用的主要作用是在函数参数传递中,以及在函数返回值中避免不必要的拷贝。

观察以下代码: 

当我们想引用一个常量时,需要加const 修饰,因为本身常量就不能被修改。这里涉及到权限大小的概念,一般认为,相同的变量用const修饰会使得该变量的权限”变小了“。而我们的编译器认为权限变小或者权限相等是安全的,权限变大是不安全的。这也是为什么我们想引用一个常量需要用const修饰。

为什么使用常引用?

1.避免拷贝: 在函数参数传递中,使用常引用可以避免不必要的对象拷贝提高程序性能。如果不使用常引用,传递大型对象时可能会导致额外的拷贝操作。

2.保护数据: 常引用可以用于声明对数据的只读访问,防止在函数内部意外修改传递的数据。

3.适用于临时对象: 常引用可以绑定到临时对象,使得在函数调用期间可以使用这些临时对象,而不需要为其创建命名变量。

 4.引用的使用场景

1.做参数

void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}

比如我们想 实现一个交换数值函数,使用引用就可以通过改变形参的值来影响实际参数,类似指针。

2.做返回值

 我们可以看到,因为n被static修饰,在静态区,生命周期是全局,所以当我们返回其引用时依旧可以访问并修改n的值。a作为返回值其实也是一个对n的引用,而对a修改实际上就是对n修改。

那如果n没有被static修饰,却被作为引用返回了呢?

思考以下代码

函数返回时,出了函数作用域,如果返回对象还在(还没还给系统,比如被static修饰或者是全局变量),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。像上述代码的变量c,出了函数作用域后该变量的空间就被系统回收了,此时ret的地址同样是被回收的变量c之前的地址,再输出ret就会出现不确定的结果。因为我们已经不知道该空间被回收之后干了什么(可能被其它变函数栈帧中的变量覆盖),所以得到的结果是不确定的。

5. 传值、传引用效率比较

以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。那么对于引用来说,它不需要临时拷贝,而是返回一个"别名",用做形参时,也只是一个临时的”别名“,函数生命周期结束,该别名就直接被销毁。这一点来说,引用和指针起到的作用几乎是一样的。

1.传参效率比较

测试方法:两个被测试函数只允许参数类型不一样,函数调用相同次数的情况下,分析各自所需时间大小。

2.返回值效率比较

测试方法:两个被测试函数只允许返回值类型不一样,函数调用相同次数的情况下,分析各自所需时间大小。

总结:

无论是做参数还是做返回值,传值和指针在作为传参以及返回值类型上效率相差很大

 6.引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间

但是 在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

引用和指针的不同点:
1. 引用概念上是定义一个变量的别名,指针存储一个变量地址
2. 引用在定义时必须初始化,指针没有要求
3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何
一个同类型实体。

4. 没有NULL引用,但有NULL指针。
5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
位平台下占4个字节)


6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
7. 有多级指针,但是没有多级引用
8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
9. 引用比指针使用起来相对更安全

     引用在定义时就与变量绑定了,指针可以随意切换指向的地址空间。从某种角度来说,权限越大,越不安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/372633.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

想上岸?有这个神器足矣!

之前说的给大家一个大惊喜!今天终于迎来了见证时刻! 我们的官网上线啦!!! 截止目前我已经做了200套名校真题,100所择校分析,150篇分院校重点勾画,以及非常非常多的文章&#xff0c…

简单的JavaScript去下载转换为Base64的PDF文件

新建一个文件,内容填写如下,然后保存为 .html 类型的文件 再用浏览器打开,就会是下面这样子: 图一红色textarea里面,可以将PDF文件转换成BASE64位后的内容贴进去,点击下载时,就可以直接下载成PD…

Matlab数字图像处理——图像复原与滤波算法应用方法

图像处理领域一直以来都是计算机科学和工程学的一个重要方向,图像复原则是其中一个重要的研究方向之一。图像复原旨在通过运用各种滤波算法,对图像进行去噪、恢复和改善,以提高图像的质量和可视化效果。在本文中,我们将介绍如下内…

WordPress主题YIA如何将首页的置顶小工具改为站长推荐小工具?

YIA主题有“置顶推荐”小工具,首页文章列表页有置顶功能,可在YIA主题设置 >> 列表 >> 首页-最新发布 >> 显示置顶文章中开启或关闭。如果将“置顶推荐”小工具添加到“首页顶栏”,同时也开启首页最新发布的“显示置顶文章”…

kernel32.dll文件缺失要如何解决?科学分享kernel32.dll文件

面对 kernel32.dll 文件丢失的问题,别担心!这篇文章将为您提供多种有效的解决策略,不论您是电脑专家还是刚入门的新手,我们的指南都能帮到您。详细的步骤和每种方法的具体注意点都在这里,按照指南操作,您将…

【c/python】GtkGrid

一、GtkGrid GtkGrid 是 GTK (GIMP Toolkit) 中的一个基础容器构件(widget),它可以用来安排其他构件在一个灵活的多行多列的网格中。每个加入网格的构件都可以占据一个或多个行和列。由于 GtkGrid 提供了在二维空间中安排构件的方式&#xf…

Jenkins配置http请求github,发布release

学无止境,气有浩然! Jenkins配置http请求github,发布release 前言Jenkins配置github配置在这里插入图片描述 打完收工! 前言 工作中进行了github迁移,原先的gitlab中配置的Jenkins的CI/CD步骤需要发布到Github发布release版本&am…

【发票识别】新增针对图片发票的识别(升级中)

说明 为了完善发票识别的功能,目前发票识别支持发票图片格式的识别,增加可用性。 体验 体验地址:https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票,可以下载上传识别或者复制url地址进行识别。 技术栈…

Windows下Node.js下载安装及环境变量配置教程

Windows下Node.js下载安装及环境变量配置教程 安装版本:node-v18.19.0-x64.msi 文章目录 Windows下Node.js下载安装及环境变量配置教程一、Node.js和NPM简介二、下载地址三、安装步骤四、环境配置五、安装淘宝镜像总结 一、Node.js和NPM简介 1、Node.js &#xf…

产品经理学习-产品运营《如何策划一场活动》

互联网活动怎么玩 最常听到的有: 注册有奖、拉新有奖 签到积分 秒杀、大促、神券 和过去相比,现在活动的特征变化: 线上化、形式丰富、覆盖人群广、即时性、效果可控 什么是活动运营 通过策划不同形式的活动,进行有效的资源和…

渗透测试练习题解析 2(CTF web)

题目均来自 BUUCTF 1、[极客大挑战 2019]Upload 1 考点:文件上传漏洞 进入靶场 一看就知道是考察文件上传漏洞,看源码有没有敏感信息 没有什么敏感信息,那我们试着按要求传一张图片看看结果,但是传了 png、jpg 类型的图片后发现上…

云服务器也能挂游戏 安卓模拟器

安卓模拟器云服务器 什么是BlueStacks模拟器主机? 特网科技基于Windows操作系统预装了BlueStacks Android模拟器您能够通过Android模拟器安装Android应用程序、如APP游戏、安卓APP、APP游戏等。 我可以在主机上安装应用程序吗? 你可以在BlueStacks模…

代码随想录算法训练营第二十七天|39. 组合总和、40. 组合总和 II、131. 分割回文串。

39. 组合总和 题目链接:组合总和 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这…

Docker部署Teedy文件系统

目录 效果 安装 1.创建目录 2.创建并启动容器 使用 1.引导页 2.新建一个文档 3.搜索 效果 安装 1.创建目录 mkdir -p /opt/teedy/data && cd /opt/teedy 2.创建并启动容器 docker run -d \ --restart always \ -p 10045:8080 \ -e DOCS_BASE_URLhttp://…

计算机网络——03网络核心

网络核心 网络核心 网络核心:路由器的网络状态基本问题:数据怎样通过网络进行传输 电路交换:为每个呼叫预留一条专有电路分组交换 将要传送的数据分成一个个单位:分组将分组从一个路由器传到相邻路由器(hop&#xff…

Nicn的刷题日常之 有序序列判断

目录 1.题目描述 描述 输入描述: 输出描述: 示例1 示例2 示例3 2.解题 1.题目描述 描述 输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据…

Java Collection 的多种遍历操作

Java Collection 的多种遍历操作 package com.zhong.collection;import javax.swing.plaf.IconUIResource; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class CollectionFor {public static void main(String[] args) {Coll…

【技术支持】在使用object-fit: cover对大图进行缩放时,图片锯齿化的解决

在chrome浏览器是这样,火狐就正常 1,在使用object-fit: cover时,图片中电线显示明显异常 2,在使用object-fit: cover时,并且禁用Chrome的GPU Rasterization

【入门篇】RedHat 8 打开终端的快捷方式-红帽 RHEL 8如何设置快捷方式

0、序 红帽系统8版本中,终端默认未分配快捷键,需要点击左上角再依次点击终端进行打开,对经常使用终端的用户来说,比较不方便。本文记录添加终端打开快捷键过程。 1、环境 Red Hat Enterprise Linux release 8.4 (Ootpa) 2、默认…

编码世界探秘:原反补码与实数表示,含定点、浮点及BCD编码

数值的编码表示 整数编码表示 在计算机中,因为只有0和1这两种形式,但为了表示数的正(),负(-)号,就要将数的符号以0和1编码。 通常把一个数的最高位定义为符号位,用0表…