C++引用与指针比较

引子:

问题:

指针指向变量必须类型一致(int对int*类型指针),这样计算,解引用才能得到正确的结果,那引用也是如此吗?

回答:(常引用)

从语法来说,引用需要与被引用变量类型相同,但是请看下面代码:

如果int&r=d会报错,为什么const修饰一下就行了呢?

从底层来说:类型转换是产生一个常量性临时变量(同const修饰),把被转换数的某一部分给予这个临时变量,再把临时变量给予左值。代码中是把d的整数区给予临时变量,再把常量性临时变量给r引用,这就是为什么直接引用不同类型变量会报错,根本在于不能引用类型转换产生的常量性临时变量。同理,用Int变量接受double型变量也是如此。(此临时变量作用域任然是代码块内)

这同样使得被const修饰的引用能引用所有会类型转换的量(包括常量),因为其本质是引用常量性临时变量。

拓展:

另一个产生常量性临时变量的场景:表达式运算

可以看到,编译器用两个寄存器分别拷贝了两个变量,把其中一个寄存器的加到另一个上,再把加完的给个临时变量(rbp+64h)在把临时变量地址给寄存器,把临时变量给j引用。

1.相同与不同

1.不同:1.引用在语法上不开辟空间,指针开辟指针变量

                (底层两者都开辟空间,引用也是用指针实现的)

              2. 定义:引用定义时要初始化,且不能初始化为常数和空,且定义后不能改变引用对象,指针相反。

              3. sizeof:引用为所引用对象类型大小,指针为4或8字节。

              4.运算:引用为引用对象运算,指针只能+n跳过指向类型的空间。

              5.使用:无多级引用,且使用时由编译器处理,比指针安全。

2.相同;

              1. 效率:因为引用底层由指针实现,所以指针与引用效率相同。与传值相比他们在作为传参以及返回值类型上效率提升很多。(传值要开辟空间,拷贝值)

注意:引用不能替代指针,因为指针能改,让其在链表等结构中成为必要。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C】leetcode力扣—— 141. 环形链表Ⅰ

目录 141. 环形链表 Ⅰ题目解题思路分析暴力求解??快慢指针 代码 141. 环形链表 Ⅰ 题目链接: https://leetcode.cn/problems/linked-list-cycle/description/ 题目 题目 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某…

【基于HTML5的网页设计及应用】——二级级联菜单

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

两分钟1200帧的长视频生成器StreamingT2V来了,代码将开源

两分钟1200帧的长视频生成器StreamingT2V来了,代码将开源 广阔的战场,风暴兵在奔跑…… prompt:Wide shot of battlefield, stormtroopers running… 这段长达 1200 帧的 2 分钟视频来自一个文生视频(text-to-video&#xff09…

25.死锁

一个线程如果需要同时获取多把锁,就容易产生死锁。 t1线程获得A对象锁,接下来想获取B对象的锁。 t2线程获得B对象锁,接下来想获取A对象的锁。 /*** 死锁demo* param args*/public static void main(String[] args) {Object a new Object(…

Go的数据结构与实现【LRU Cache】

介绍 在本文中,我们将用Go实现LRU Cache。 LRU Cache 最近最少使用(LRU)是一种缓存逐出算法,它按使用顺序组织元素。在LRU中,最长时间没有被使用的元素会被从缓存中逐出。 例如,如果我们有一个容量为三…

蓝牙耳机哪个品牌的好用?五款热销机型推荐,新手入门必备!

​真无线蓝牙耳机近年来非常流行,它们不仅小巧便携,而且在佩戴舒适度和音质方面也逐步超越了有线耳机。面对市场上众多的真无线蓝牙耳机,选择合适的款式可能会令人困惑。我将为你推荐几款既舒适又性能表现不错的蓝牙耳机,希望能帮…

【学习】成为优秀的软件测试工程师需要学哪些知识

成为软件测试工程师,需要学习的内容非常的多,但是无非是这几大类,今天就和小编一起来看看这些知识,你是否都已经掌握。 01、测试环境的搭建 本部分主要是学习从操作系统开始,有关的计算机基础知识、软件和硬件知识、…

【java】关于String、StringBuffer和StringBuilder的那些事

在之前的文章中我们曾简单介绍过String这个引用类型变量,其实它还有许多特性,还有StringBuffer和StringBuilder这两个方法在字符串操作中也有非常重要的地位,接下来就由小编带大家梳理一下吧👊 目录 一、String 1、构造方法 2、…

分库分表 ——12 种分片算法

目录 前言 分片策略 标准分片策略 行表达式分片策略 复合分片策略 Hint分片策略 不分片策略 分片算法 准备工作 自动分片算法 1、MOD 2、HASH_MOD 3、VOLUME_RANGE 4、BOUNDARY_RANGE 5、AUTO_INTERVAL 标准分片算法 6、INLINE 7、INTERVAL COSID 类型算法 …

网络加速器数据可视化大屏:极速网络新体验从这里开始

在信息爆炸的时代,网络已经成为我们日常生活和工作中不可或缺的一部分。然而,网络速度慢、不稳定等问题时常困扰着我们,让许多重要的工作和学习进度受到严重影响。 网络加速器数据可视化大屏集数据分析、可视化展示于一体,它不仅能…

docker--部署 (超详版) (五)

环境准备:docker,mysql,redis,镜像,nginx 把虚拟机打开,连接xshell,参考博客: https://blog.csdn.net/m0_74229802/article/details/136965820?spm1001.2014.3001.5501 一&#x…

GoogLeNet

文章目录 Inception块GoogLeNet模型 Inception块 在GoogLeNet中,基本的卷积块被称为Inception块,如下图所示: Inception块由四条并行路径组成。 前三条路径使用窗口大小为1x1,3x3和 5x5的卷积,从不同空间大小中提取信息。中间的两条路径在输…