C++的指针和引用:

目录

引用:

注意:

左值引用和右值引用:

左值引用:

右值引用:

指针:

指针与引用的区别:


引用:

在C++中,‌引用‌是一种为已存在变量创建别名的机制,它允许通过不同的名称访问同一块内存空间的数据。

上述图对应的引用代码:

int a=1;
int &b=a;

先初始化定义一个变量a,编译器会为变量a开辟一个存储空间并存储值。然后又对变量a进行了一个引用将变量b绑到变量a的内存地址,不会额外占用内存空间,也就是变量b是变量a的别名,变量a和变量b的地址都是一样的,对同一块内存空间进行管理。变量b也能访问变量a中的值并且也能进行修改。

访问变量a的存储空间中的值需要先知道变量a的地址。我们可以把变量a的存储空间看成一个房间,而变量a的地址就是这个房间的门牌号,变量b对变量a进行一个引用,就相当于把变量b也当成变量a的房间号,然后通过变量b也能够找到该房间。变量a和变量b都这间房间的门牌号,无论谁对房间里面的值进行修改,变量a和变量b的值都会发生变化。

注意:

引用前必须进行初始化:引用在创建时必须被初始化,它必须指向某个已存在的对象。

一旦绑定之后,不可改变:引用一旦被初始化后,它将一直保持与其初始对象的绑定,不能改变为另一个对象的引用。

没有空引用:引用必须指向某个对象,不能存在空引用。

左值引用和右值引用:

左值引用:

表示持久化对象,具有明确内存地址(可&取址),可以被多次赋值,可出现在赋值符号左侧或右侧。可以被多次赋值。

右值引用:

表示临时对象或字面量,无持久地址(不可&取址),仅能出现在赋值符号右侧。主要用于是在函数参数和返回值中,以实现更高效的资源管理和更灵活的代码编写方式。

指针:

指针是存储内存地址的变量,通过地址间接访问数据。其值为另一个变量的内存位置直接地址,而不是数据本身。引用本身不是一个对象,不能定义只想引用的指针。

int a = 10;
int *b = &a;

初始化定义变量a,编译器会为其开辟一个空间并存储值。"int *b = &a"将变量a的地址进行赋值给变量b,因为变量b也是一个变量,所以编译器也会其开辟一个存储空间,将变量a的地址存储到变量b的内存空间中。

指针的地址也可以用另一个指针进行存储。

int a = 10;
int *b= &a;
int **c = &b;

使用一个指针c将指针b的地址存储到其存储空间中。如果想要通过其存储的地址进行访问到变量a具体的值,那么就可以进行解引用操作来进行访问。

std::cout<<"a的值"<<a<<std::endl;
std::cout<<"通过指针b访问"<<*b<<std::endl;
std::cout<<"通过指针c访问"<<**c<<std::endl;

指针c通过一次解引用"*c"得到的就是指针b也就是变量a的地址,因为指针c中存储的是变量b的地址,c就代表变量b的地址,那么对c进行一次解引用就会得到指针b中存储的内容。再对指针b进行一个解引用"*b"那么就相当于对指针c进行了两次解引用操作"**c"就是对指针b中存储的内容(变量a的地址)进行一次解引用,那么就会得到变量a中的值。

指针的一个运算:

数组的数组名就是一个指向数组的首元素的指针,如果定义一个指针存储数组首元素的地址进行一个自增的话,因为数组是一块连续的内存空间,根据数组存储的数据类型占用的字节大小,来进行一个首元素地址,也就是起始地址来进行偏移,得到下一个元素的内存地址。

注意:数组名是一个常量指针,不可以修改指向,对数组名进行修改是非法的。可以通过数组名+i,来进行一个数组中元素的偏移地址。

int arr[10] = {0};
int *p = arr;
std::cout<<p<<std::endl;
p++;
std::cout<<p<<std::endl;

可以用上述方式进行一个验证。

指针与引用的区别:

指针可以不用进行初始化,引用必须进行初始化。

指针是一个变量,编译器会为其分配存储空间,而引用不是一个对象,不会为其分配存储空间。

指针可以进行多级引用,而引用不可以多级引用。

指针在其生命周期内可以修改指向的对象,而引用一旦绑定对象之后,则不可以进行修改。

对指针进行计算大小:sizeof(指针)的大小与指向的数据类型无关,在32位系统中为4字节,在64为系统中占8字节,而引用不同,因为引用本身不占独立的存储空间,sizeof(引用)的大小是其绑定对象的大小。

指针可以为空,而引用不能为空,必须绑定对象。

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

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

相关文章

图像处理中的伪影

目录 一、块效应伪影 / 块状伪影 二、 去除块状伪影 三、振铃伪影 一、块效应伪影 / 块状伪影 块状伪影(Blocking Artefacts)是对经过变换编码的图像进行重建时&#xff0c;图像中可能会出现压缩过程产生的可见伪影。基于块的变换编码中&#xff0c;一种常见伪影是 “块效应…

Java:对象的浅拷贝与深拷贝

目录 一、概念 二、实现方式 2.1 浅拷贝&#xff08;不推荐&#xff09; 2.2 深拷贝 2.2.1 方法一&#xff1a;重写 clone() 方法并递归克隆&#xff08;常用&#xff09; 2.2.2 方法二&#xff1a;通过序列化实现&#xff08;更强大&#xff0c;但更重&#xff09; 2.2…

佰钧成 社招 一面

1. “评估需求、排期”的工作流程&#xff1f; “我的工作流程一般是这样的&#xff1a; 需求评审&#xff1a; 首先会和产品、后端同学一起过需求&#xff0c;确保我完全理解了业务背景和要实现的价值&#xff0c;而不仅仅是功能点。技术方案设计&#xff1a; 之后&#xff0c…

最短路径问题(图论)

1 Floyd 作用&#xff1a; 求图中所有顶点之间的最短路径&#xff0c;包括有向图或者无向图&#xff0c;权重正负皆可&#xff0c;用来一次性求所有点之间的最短路径。 思路是 通过逐步扩大中间层&#xff0c;使得最短路径不断被更新&#xff0c;直到中间层扩大到n位置&#…

2025年8月新算法—云漂移优化算法(Cloud Drift Optimization Algorithm, CDO)

1、简介 这项研究介绍了云漂移优化&#xff08;数位长&#xff09;算法&#xff0c;这是一种创新的自然启发的元启发式方法来解决复杂的优化问题。CDO模仿受大气力影响的云粒子的动态行为&#xff0c;在探索和利用之间取得了微妙的平衡。它具有自适应权重调整机制&#xff0c;可…

VS Code进行.NET开发时使用断点和热重载

VS Code 调试热重载 1. VS Code 设置 安装扩展&#xff1a;C#、C# Dev Kit设置中搜索hot reload&#xff0c;选择C#开发工具包&#xff0c;把下图的几项全部打勾2. 启动项目&#xff08;仅用左侧“运行和调试”&#xff09; 打开解决方案&#xff0c;选你的启动项目的“.NET La…

mysqlbinlog解析命令

解析 MySQL Binlog 详细信息的命令以下是解析 MySQL Binlog 详细信息的常用命令&#xff1a;1. 基本 binlog 解析命令# 查看 binlog 文件内容&#xff08;基本格式&#xff09; mysqlbinlog /var/lib/mysql/mysql-bin.000001# 查看特定时间段的 binlog mysqlbinlog --start-dat…

算法训练营day60 图论⑩ Bellman_ford 队列优化算法、判断负权回路、单源有限最短路(修改后版本)

增加对最短路径的优化算法、负权回路、单源有限最短的讲解 Bellman_ford 队列优化算法 -------------------------------------------------------------------------------- 8.24更新&#xff1a;该算法是针对带负值的最短路径的优化算法&#xff0c;核心通过队列来实现&…

Python 学习(十六) 下一代 Python 包管理工具:UV

目录1. UV 介绍1.1 什么是UV&#xff1f;1.2 UV的核心优势1.3 UV和其他工具对比1&#xff09;UV vs. pipvirtualenv2&#xff09;UV vs. Conda3&#xff09;UV vs. Poetry4&#xff09;功能对比表2. UV的安装与常用命令2.1 安装UV1&#xff09;使用官方安装脚本&#xff08;推荐…

Redis学习笔记 ----- 缓存

一、什么是缓存 缓存&#xff08;Cache&#xff09;是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;一般读写性能较高。 &#xff08;一&#xff09;缓存的作用 降低后端负载&#xff1a;减少对数据库等后端存储的直接访问压力。提高读写效率&#xff0c;降低…

React响应式链路

文章目录响应式链路的核心环节1.状态定义与初始化2.状态更新触发&#xff08;状态变更&#xff09;3.调度更新&#xff08;Scheduler&#xff09;4.重新渲染&#xff08;Render 阶段&#xff09;5.协调&#xff08;Reconciliation&#xff09;与 Fiber 架构6.提交更新&#xff…

软件设计师——计算机网络学习笔记

一、计算机网络 网络基础 1. 计算机网络的分类2. 网络拓扑结构 总线型(利用率低、干扰大、价格低) 星型(交换机形成的局域网、中央单元负荷大) 环型(流动方向固定、效率低扩充难) 树型(总线型的扩充、分级结构) 分布式(任意节点连接、管理难成本高)一般来说&#xff0c;办公室局…

1200 SCL学习笔记

一. IF. 如果。下面是一个起保停IF #I_start AND NOT #I_stop THEN //如果I_start接通 和 I_stop没有接通#Q_run : 1; //输出Q_run 接通 ELSIF #I_stop THEN //如果I_stop接通#Q_run : 0; //。。。。。。 END_IF;二. CASECASE…

单例模式与线程池

1. 单例模式单例模式是一种常用的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。这种模式在需要控制资源访问、管理共享状态或协调系统行为时非常有用。单例模式的核心特点&#xff1a;私有构造函数&#xff1a;防止外部通过n…

Chrome和Edge如何开启暗黑模式

Edge和Chrome浏览器都提供了实验性功能&#xff0c;可以通过修改实验性设置来开启暗黑模式。 在浏览器地址栏中输入edge://flags/&#xff08;Edge&#xff09;或chrome://flags/&#xff08;Chrome&#xff09;。在搜索框中输入“dark”&#xff0c;找到与暗黑模式相关的选项。…

【科研绘图系列】浮游植物的溶解性有机碳与初级生产力的关系

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 数据准备 数据处理 溶解性有机碳(DOC)与初级生产力(NPP)的关系 溶解性有机碳(DOC)与光照强度(PAR)的关系 数据可视化 加载R包 数据下载 导入数据 画图1 画图2 总结 系统信…

IDEA相关的设置和技巧

IDEA相关的设置和技巧 我的博客对应文章地址 1.布局设置 IDEA的布局自定义程度很高&#xff0c;顶部工具栏&#xff0c;侧边栏都可以随意定制&#xff0c;设置好的布局方案可以保存&#xff0c;在新项目中快速使用 1.1 工具栏设置 [!tip] 举个例子&#xff1a;比如我要在顶部…

AWS Lambda 完全指南:解锁无服务器架构的强大力量

在云计算的发展浪潮中,无服务器(Serverless) 架构已然成为构建现代应用的新范式。而在这场变革的中心,AWS Lambda 作为开创性的 Function-as-a-Service (FaaS) 服务,彻底改变了我们部署和运行代码的方式。 本文将带您深入探索 AWS Lambda,从核心概念、工作原理到高级实践…

人工智能时代下普遍基本收入(UBI)试验的实践与探索——以美国硅谷试点为例

一、硅谷UBI试验的最新进展&#xff08;2025年&#xff09;1. 试验规模与资金来源圣克拉拉县试点&#xff1a;硅谷所在地圣克拉拉县针对脱离寄养家庭的年轻人开展UBI试验&#xff0c;每月发放1000美元补贴&#xff0c;持续1-2年&#xff0c;覆盖约60名参与者&#xff0c;成本约…

云计算之云主机Linux是什么?有何配置?如何选?

一、云环境如何选择Linux发行版 1.1、Linux在各个领域的发展 Linux在各个领域的发展序号Linux发展领域说明1Linux在服务器领域的发展目前Linux在服务器领域已经占据95%的市场份额&#xff0c;同时Linux在服务器市场的迅速崛起&#xff0c;已经引起全球IT产业的高度关注&#xf…