c++详解系列(引用指针)

目录

1.什么是引用

2.引用的定义

 3.引用的特性

4.引用的使用

4.1引用传参

4.2传引用返回

5.const引用(在引用的定义前用const修饰)

5.1对于引用

5.2对于指针

6.引用&指针

总结


1.什么是引用

引用就是给变量起别名,一个变量可以有多个别名,引用变量不会另辟空间,语法上和被引用的变量公用同一块空间,就像一个人可以有多个称号,所有称号都是再说一个人。

2.引用的定义

类型& 引用别名 =被引用对象;

 3.引用的特性

  • 引用在定义时必须初始化
  • 一个变量可以有多个引用
  • 引用一旦引用一个实体就不能再引用其他实体
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{const char* jjxt= "帅哥";const char*& x = jjxt;const char*& bozhu = jjxt;int a = 1;int& b = a;int& c = b;cout << jjxt << endl;cout << xxj << endl;cout << bozhu << endl;//const修饰的字符串没法修改cout << a << endl;cout << b << endl;cout << c << endl;++b;//因为本质是同一块空间里的同一个数据,一变全变cout << a << endl;cout << b << endl;cout << c << endl;return 0;
}

 

4.引用的使用

引用主要被用于引用传参和做返回值时减少拷贝提高效率,和改变引用对象同时改变被引用对象(功能类似指针)在c++中大部分地方我们用引用代替指针,但是少部分地方任然离不开指针(比如链表,因为引用无法改变指向)

归根结底是因为引用对和被引用对象公用同一空间 。

4.1引用传参

void Swap(int* rx, int* ry)
{int tmp = *rx;*rx = *ry;*ry = tmp;
}void Swap(int& rx, int& ry)
{int tmp = rx;rx = ry;ry = tmp;
}

swap是典型的传址调用函数,可以用传引用代替。

4.2传引用返回

int& func1()
{int ret = 0;return ret;  
}
int main()
{int& x = func1();cout << x << endl;return 0;
}

ret在函数栈帧销毁时,空间已经被系统回收,该空间是否被覆盖(被用于存放其他内容)是未知的,取决于编译器,该函数的返回值是一个ret的一个引用,可以理解为系统给了一个临时的引用变量int& tmp = ret,而引用x又对tmp进行引用,也就是说x和被销毁的ret公用一个空间,这是危险的,毕竟我们不知道ret被销毁后,原空间是什么状态。

运行结果:

int& func1()
{int ret = 0;return ret;  
}
int& fun2()
{int y = 123;return y;
}
int main()
{int& x = func1();cout << x << endl;fun2();cout << x << endl;return 0;
}

 当我们创建于func1几乎相同的,在vs环境中,编译器将原来用于func1的函数栈帧空间分配给func2,导致原来局部变量ret使用的空间被覆盖,此时再通过别名来访问这个空间,就会发现期望的x值已经发生改变。

上述情况是基于被引用对象随着函数栈帧销毁而销毁的情况,这种情况不推荐使用传引用返回,那么反之,当被引用对象不会随着函数栈帧的销毁而销毁时,传引用返回的使用就会使函数更加便捷和灵活,我们推荐使用传引用返回。

对于顺序表中,查找和修改指定位置的函数,利回就用传引用返能合二为一

这时SLat函数独自就能完成读写的操作。 

5.const引用(在引用的定义前用const修饰)

被const修饰的对象具有常性,只能读,不能写,也就是访问权限缩小(一般权限的放大缩小是对引用和指针来说的)

对于const修饰的对象,必须用const引用 

对于普通对象,const引用也能引用

这是因为,访问权限在引用的过程中只能缩小不能放大

5.1对于引用

int main()
{const int a = 0;int& ra = a;return 0;
}

       这里就会报错,权限被放大了。

5.2对于指针


int main()
{const int a = 0;int& ra = a;int b = 0;const int* p = &b;int* p2 = p;return 0;
}

指针的访问权限被放大,所以报错。(这里多提一点,被const修饰的指针,是它指向的变量具有常性,而不是指针本身具有常性)。

综上所述,我们可以知道,在用引用传参是尽量加上const,这样不管被引用对象是否被const修饰,都可以进行传参。

5.3类型转换中的常性

和函数返回时,产生临时变量一样,类型转换也会产生临时变量。

产生的临时变量为指定的类型且具有常性的。而跨类型引用本质上是对临时变量的引用

int main()
{int i = 0;double& ri = i;int i = 0;const double& ri = i;
}

这里的引用,本质上是对具有常性double类型的临时变量的引用。

6.引用&指针

  • 语法概念上,引用是给一个变量取别名,不开新空间,指针是直接创建一个指针变量来存地址,需要开辟空间。
  • 语法上,引用在定义时就要初始化,指针在语法上不强求。
  • 引用一旦确定被引用对象就不能更改,指针可以不断改变指向的对象。
  • 引用可以直接访问被引用对象,而指针需要解引用。
  • sizeof的含义不同,引用是被引用对象的类型大小,指针是地址所占字节个数,32位是4,64位是8。
  • 指针很容易出现野指针问题,引用相对安全一些。

二者在实践中有重叠性,但又各有千秋,它们相辅相成,互相不可完全替代。

总结

基本概念
引用是为变量创建的别名,与被引用变量共享内存空间。一个变量可拥有多个引用

核心特性
1. 必须初始化
2. 可多级引用(一个变量多个别名)
3. 一旦绑定实体后不可更改引用对象

主要用途
1. 函数参数:替代指针实现传址调用,更安全简洁
2. 返回值:避免拷贝开销,但需注意返回局部变量引用的风险

const引用
遵循"权限不放大"原则:const对象必须用const引用,普通对象可用const引用
类型转换时会生成具有常性的临时变量

与指针对比
1. 内存:引用不占额外空间,指针需要存储地址
2. 安全性:引用更安全,不存在野引用问题
3. 灵活性:指针可重定向,引用一旦绑定不可更改
4. 访问方式:引用直接访问,指针需解引用

本质区别:引用是语法层面的别名机制,指针是底层的内存地址操作。两者在C++中互补使用,各有适用场景

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

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

相关文章

深度学习loss总结(二)

对于目前深度学习主流任务学习,loss的设置至关重要。下面就不同任务的loss设置进行如下总结: (1)目标检测 2D/3D目标检测中的 Loss(损失函数)是训练模型时优化目标的核心,通常包括位置、类别、尺寸、方向等多个方面。以下是目前 常见的 2D 和 3D 目标检测 Loss 分类与…

【Linux网络】netstat 的 -anptu 各个参数各自表示什么意思?

netstat 是一个网络统计工具&#xff0c;它可以显示网络连接、路由表、接口统计、伪装连接和多播成员资格。在 netstat 命令中&#xff0c;不同的参数可以用来定制输出的内容。 你提到的 -anptu 参数组合各自的功能如下&#xff1a; -a (all): 显示所有活动的连接和监听端口。它…

[硬件电路-115]:模拟电路 - 信号处理电路 - 功能放大器工作分类、工作原理、常见芯片

功能放大器是以特定功能为核心的集成化放大电路&#xff0c;通过将运算放大器与外围电阻、电容等元件集成在单一芯片中&#xff0c;实现标准化、高性能的信号放大功能。其核心优势在于简化设计流程、提升系统稳定性&#xff0c;并针对特定应用场景优化性能参数。以下从定义、分…

双网卡UDP广播通信机制详解

UDP广播通信机制详解 一、通信流程分析 发送阶段 通过Client.Bind(192.168.0.3, 60000)将UDP套接字绑定到指定网卡和端口设置RemoteHost "255.255.255.255"实现全网段广播数据流向&#xff1a;192.168.0.3:60000 → 255.255.255.255:50000 接收阶段 设备响应数据应返…

从遮挡难题到精准测量:激光频率梳技术如何实现深孔 3D 轮廓的 2um 级重复精度?

一、深孔 3D 轮廓测量的遮挡困境深孔结构&#xff08;如航空发动机燃油喷嘴孔、模具冷却孔&#xff09;因孔深大&#xff08;常超 100mm&#xff09;、深径比高&#xff08;&#xff1e;10:1&#xff09;&#xff0c;其 3D 轮廓测量长期受限于光学遮挡难题。传统光学测量技术&a…

.NET 依赖注入(DI)全面解析

文章目录一、依赖注入核心原理1. 控制反转(IoC)与DI关系2. .NET DI核心组件二、服务生命周期1. 三种生命周期类型三、DI容器实现原理1. 服务注册流程2. 服务解析流程四、高级实现方法1. 工厂模式注册2. 泛型服务注册3. 多实现解决方案五、ASP.NET Core中的DI集成1. 控制器注入2…

K8S部署ELK(二):部署Kafka消息队列

目录 1. Kafka 简介 1.1 Kafka 核心概念 &#xff08;1&#xff09;消息系统 vs. 流处理平台 &#xff08;2&#xff09;核心组件 1.2 Kafka 核心特性 &#xff08;1&#xff09;高吞吐 & 低延迟 &#xff08;2&#xff09;持久化存储 &#xff08;3&#xff09;分…

Rust进阶-part1-智能指针概述-box指针

Rust进阶[part1]_智能指针概述&box指针 智能指针概述 在Rust中,智能指针是一类特殊的数据结构,它们不仅像普通指针一样可以引用数据,还带有额外的元数据和功能。与普通指针不同,智能指针通常使用结构体实现,并且会实现 Deref 和 Drop 等特定的trait,以提供更强大的…

C++扩展 --- 并发支持库(补充1)

C扩展 --- 并发支持库&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/149606406?fromshareblogdetail&sharetypeblogdetail&sharerId149606406&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link atom…

在Three.js中导入和添加自定义网格的最佳实践 - 综合指南

探索在Three.js中导入和添加自定义网格的最佳实践。本指南涵盖增强 3D 项目的技术、技巧和实际示例。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 强烈建议使用 GLTF 格式来集成 3D 几何体&#xff0c;提供简化的流程&#xff0c;并固有地支持动画、…

Redis知识点(1)

目录 Redis Redis和MySQL的区别 Redis的高可用方案 Redis可以用来做什么 Redis的数据类型 字符串 列表 哈希 集合 有序集合 Bitmap Redis为什么快呢&#xff1f; I/O多路复用 说说select,poll,epoll,kqueue,IOCP的区别 Redis为什么早期选择单线程&#xff1f; …

使用iptables封禁恶意ip异常请求

查看后端日志发现一IP&#xff08;103.76.250.29&#xff09;频繁请求不存在的资源路径​​&#xff08;如 /api/v1/guest/comm/config、/theme/default/assets/compoments.js 等&#xff09;&#xff0c;并伴随对根路径 / 的正常访问。这种行为的可能性包括恶意扫描、自动化工…

BehaviorTree.Ros2 编译教程

1. 源码下载 git clone https://github.com/BehaviorTree/BehaviorTree.ROS2.git2. 编译过程 源码中有3个项目: btcpp_ros2_interfacesbtcpp_ros2_interfacesbtcpp_ros2_samples 2.1 编译btcpp_ros2_interfaces: colcon --packages-select btcpp_ros2_interfaces2.2 编译 …

AR智能巡检系统:制造业设备管理的效率革新

随着工业4.0和数字化转型的加速&#xff0c;设备管理在制造业、能源、交通等关键领域的重要性愈发凸显。传统设备巡检依赖人工记录和纸质报告&#xff0c;不仅效率低下&#xff0c;还容易因人为疏忽导致数据错误或安全隐患。然而&#xff0c;增强现实&#xff08;AR www.teamhe…

破解海外仓客户响应难题:自动化系统是关键

在跨境电商蓬勃发展的当下&#xff0c;海外仓作为连接卖家与终端消费者的重要枢纽&#xff0c;其服务效率直接影响着卖家的运营成果。其中&#xff0c;即时客户响应一直是行业痛点&#xff0c;尤其对中小型海外仓而言&#xff0c;单纯依靠人力维持全天候服务意味着高昂的成本压…

PyTorch基础——张量计算

文章目录PyTorch基础——张量计算1 什么是张量计算&#xff1f;2 基本算术运算2.1 加法运算2.1.2 torch.add2.1.3 a.add(b) 与 a.add_(b)a.add(b) 方法a.add_(b) 方法核心区别2.2 减法运算2.2.1 toch.sub()2.2.2 a.sub(b) 和a.sub_(b)a.sub(b) 方法a.sub_(b) 方法核心区别使用建…

云原生联调利器:Telepresence实战

Telepresence在云原生联调中的应用&#xff1a;本地服务直连K8s集群实战在云原生开发中&#xff0c;调试和测试服务常常需要本地环境与远程Kubernetes&#xff08;K8s&#xff09;集群无缝集成。Telepresence是一个开源工具&#xff0c;它允许开发者将本地服务“注入”到K8s集群…

浏览器【详解】requestIdleCallback(浏览器空闲时执行)

简介requestIdleCallback 是浏览器的一个 API&#xff0c;用于在浏览器空闲时间执行低优先级任务&#xff0c;避免阻塞主线程&#xff0c;提升页面性能和响应速度。 当浏览器完成了关键任务&#xff08;如渲染、布局、用户交互处理&#xff09;且暂时没有更高优先级的工作时&am…

STP技术

一、环路的危害1.现象链路指示灯快速闪烁MAC表震荡&#xff1a;交换机频繁修改MAC地址表 → 转发失效。2.环路危害造成的影响链路堵塞主机操作系统响应迟缓二层交换机管理缓慢冲击网关设备的CPU三、STP的作用1.STP基本原理STP即生成树协议&#xff0c;它通过阻断冗余链路来消除…

RAGFLOW~knowledge graph

start 为了增强多跳问答&#xff0c;RAGFlow在数据提取和索引之间增加了一个知识图谱构建步骤&#xff0c;如下面所示。这一步骤会从您指定的分块方法生成的现有块中创建额外的块。 从v0.16.0版本开始&#xff0c;RAGFlow支持在知识库上构建知识图谱&#xff0c;允许你在知识库…