关于C++地址交换的实现

关于地址的交换实现,我们要使用指针+引用的方式进行,例如:

#include <iostream>// 定义函数交换两个整型指针的地址
void swapIntPtrAddresses(int* &ptr1, int* &ptr2) {int *temp = ptr1;ptr1 = ptr2;ptr2 = temp;
}int main() {int num1 = 10;int num2 = 20;// 定义指向num1和num2的指针int* ptr1 = &num1;int* ptr2 = &num2;std::cout << "交换前:" << std::endl;std::cout << "ptr1指向的值:" << *ptr1 << ", ptr2指向的值:" << *ptr2 << std::endl;std::cout << "ptr1指向的地址:" << ptr1 << ", ptr2指向的地址i:" << ptr2 << std::endl;// 调用函数交换指针地址swapIntPtrAddresses(ptr1, ptr2);std::cout << "交换后:" << std::endl;std::cout << "ptr1指向的值:" << *ptr1 << ", ptr2指向的值:" << *ptr2 << std::endl;std::cout << "ptr1指向的地址:" << ptr1 << ", ptr2指向的地址:" << ptr2 << std::endl;return 0;
}

代码运行结果如下:

 

如果我们把代码写成这样,指针传递:

void swapIntPtrAddresses(int* ptr1, int* ptr2) {int* temp = ptr1;ptr1 = ptr2;ptr2 = temp;
}

它不能实现预期的交换指针地址的效果,原因如下:

在 C++ 中,函数参数的传递方式分为值传递、引用传递等。这里 swapIntPtrAddresses 函数的参数 int* ptr1 和 int* ptr2 采用的是值传递方式。

当进行值传递时,函数会为形参 ptr1 和 ptr2 分别创建独立的副本,这些副本初始时的值是来自于实参的值(也就是传入的指针的值)。

在函数内部:

  • 当执行 int* temp = ptr1; 时,是将形参 ptr1 的副本的值赋给了临时指针变量 temp
  • 接着执行 ptr1 = ptr2; 和 ptr2 = temp; 这两步操作,仅仅是在修改形参 ptr1 和 ptr2 的副本的指向,而不是修改传入的原始指针变量本身的指向。

也就是说,函数内部对形参的这些操作都局限在函数内部创建的这些副本的范围内,一旦函数执行完毕,这些副本就会被销毁,而原始传入的指针变量(实参)的值并没有发生任何改变。

所以,要想实现交换指针地址的功能,就需要采用引用传递的方式来传递指针变量,就像前面提到的 void swapIntPtrAddresses(int*& ptr1, int*& ptr2) 这种形式,这样函数内部就能直接对传入的原始指针变量进行操作,从而实现真正的指针地址交换。

同理,单单使用引用传递也是改变不了地址的,只会改变值内存上的值大小。

void swapIntPtrAddresses(int &ptr1, int &ptr2) {int temp = ptr1;ptr1 = ptr2;ptr2 = temp;
}

如果写成这样呢?

void swapIntPtrAddresses(int & *ptr1, int & *ptr2) {int* temp = ptr1;ptr1 = ptr2;ptr2 = temp;
}

这样会报错。 

int&* ptr1, int&* ptr2这种写法试图将引用和指针以一种不符合 C++ 语法规则的方式组合在一起。

int& 表示一个整型引用类型,它是某个整型变量的别名,本身并不是一个可以再被指向(也就是取地址)的实体。在 C++ 中,引用一旦绑定到一个变量上,就不能再重新绑定到其他变量,而且引用本身并没有实际的存储地址(它和所引用的变量共享地址),所以不能对引用进行取地址操作,也就不能有类似 int&* (指向引用的指针)这样的类型定义。

int* &ptr1, int* &ptr2(正确写法)

这种写法表示引用传递指针,它在很多场景下用于对指针变量本身进行操作,比如前面提到的交换指针地址等操作。

  • int* 表示一个指向整型的指针类型,即这个变量存储的是一个整型变量的地址。
  • &ptr1 和 &ptr2 表示对指针变量 ptr1 和 ptr2 进行引用操作,所以 int* &ptr1, int* &ptr2 整体的含义是将指针变量 ptr1 和 ptr2 作为引用传递进函数(也就是把指针变量本身当作别名来对待,函数内部可以直接对传入的指针变量本身进行操作)。

这里通过引用传递指针 ptr1 和 ptr2,使得函数内部的操作能够直接影响到传入的原始指针变量,从而实现指针地址的交换等对指针变量本身进行的操作。

以上就是关于地址交换的简单阐述,如有不当还请指出~

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

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

相关文章

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件&#xff0c;通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型&#xff0c;分别为胶囊类型&#xff08;Capsule&#xff09;、圆形按钮&#xff08;Circle&#xf…

SpringBoot学习笔记(一)

一、Spring Boot概述 &#xff08;一&#xff09;微服务概述 1、微服务 微服务&#xff08;英语&#xff1a;Microservices&#xff09;是一种软件架构风格&#xff0c;它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础&#xff0c;利用模块化的方式…

C++初阶(十三)--STL--vector的使用

目录 ​编辑 一、vector的基本介绍 二、vector的使用 1.构造函数的介绍 2.容量操作 size和capacity reserve和resize empty 3.vector的遍历 operator[ ](size_t n) 迭代器使用 begin和end rbegin和rend 4.vector的增删查改 push_back和pop_back insert和erase fi…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…

matlab的函数名和函数文件名的关系(编程注意事项)

在MATLAB中&#xff0c;函数名和函数文件名之间有着重要的关系。以下是它们之间的关系以及在编程时需要注意的事项 文章目录 函数名与函数文件名的关系编程时的注意事项结论 函数名与函数文件名的关系 一致性要求&#xff1a; 在MATLAB中&#xff0c;函数文件的文件名必须与函数…

【Redis】持久化机制RDB与AOF

一、RDB RDB模式是就是将内存中的数据存储到磁盘中&#xff0c;等到连接断开的时候会进行持久化操作。但是如果服务器宕机&#xff0c;会导致这个持久化机制不会执行&#xff0c;但是内存中的文件会直接丢失。所以可以设置一个触发机制&#xff0c;save 60 1000 就是代表60秒 执…

基于Lora通讯加STM32空气质量检测WIFI通讯-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重&#xff0c;空气质量的监测与管理已经…

【MySQL】ubantu 系统 MySQL的安装与免密码登录的配置

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;MySQL初阶探索&#xff1a;构建数据库基础 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;mysql的安装&#x1f4d5;MySQL的登录&#x1f30f;MySQL配置免密码登录 &#x1f4da;mysql的…

【STK学习】part2-星座-目标可见性与覆盖性分析

【Satellite Tool Kit】学习并深入了解卫星/星座生成、可见性分析、覆盖性分析等知识&#xff0c;并基于STK软件实现对应数据的导出&#xff0c;以用于算法的约束输入。 文章目录 一、学习目标二、学习内容2.1 星地可见性分析2.1.1 单星单地2.1.2 单星多地2.1.3 多星单地 2.2 星…

框架实战:SSM整合原理和实战

1. SSM整合理解 1.1. IOC两个容器对应组件 容器名盛放组件web容器web相关组件&#xff08;controller,springmvc核心组件&#xff09;root容器业务和持久层相关组件&#xff08;service,aop,tx,dataSource,mybatis,mapper等&#xff09; 配置文件 配置名对应内容对应容器Web…

自然语言处理:第六十三章 阿里Qwen2 2.5系列

本人项目地址大全&#xff1a;Victor94-king/NLP__ManVictor: CSDN of ManVictor 项目地址: QwenLM/Qwen2.5: Qwen2.5 is the large language model series developed by Qwen team, Alibaba Cloud. 官网地址: 你好&#xff0c;Qwen2 | Qwen & Qwen2.5: 基础模型大派对&a…

i春秋-登陆(sql盲注爆字段,.git缓存利用)

练习平台地址 竞赛中心 题目描述 先登陆再说 题目内容 就是一个登录框 测试登录 用户名&#xff1a;admin or 11# 密码&#xff1a;随便输 返回密码错误 用户名&#xff1a;随便输 密码&#xff1a;随便输 返回用户名不存在 这里就可以确定时一个bool盲注了 这里提供一个lik…

新华三H3CNE网络工程师认证—子接口技术

子接口&#xff08;subinterface&#xff09;是通过协议和技术将一个物理接口&#xff08;interface&#xff09;虚拟出来的多个逻辑接口。在VLAN虚拟局域网中&#xff0c;通常是一个物理接口对应一个 VLAN。在多个 VLAN 的网络上&#xff0c;无法使用单台路由器的一个物理接口…

C# - 无法加载 DLL“libmupdf.dll”: 找不到指定的模块。

1.本机环境 windows 11 64位Visual Studio 2015 2.报错如下 用户代码未处理 System.DllNotFoundException HResult-2146233052 Message无法加载 DLL“libmupdf.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 SourceMoonPdfLib TypeName"" StackTrac…

23.UE5删除存档

2-25 删除存档制作_哔哩哔哩_bilibili 按照自己的风格制作删除按钮 这样该行的存档就被从存档列表中删除了&#xff0c;并且实际存档&#xff08;我的存档蓝图&#xff09;中也被删除了 但是存在一个问题&#xff0c;如果存档数据中存在索引为: 0 1 2 3的存档&#xff0c;当索…

VSCode DeBug时无法进入自定义工具库

最近遇到一个问题&#xff0c;将自己的写的工具包放到conda里site-packagse下&#xff0c;并配置了__init__.py文件&#xff0c;当我debug时&#xff0c;想进入工具包函数调试&#xff0c;但是总是进入不了工具包函数。找了许多博客方法&#xff0c;尝试了将launch.json中的jus…

单元测试框架gtest学习(三)—— 事件机制

前言 上节我们学习了gtest的各种宏断言 单元测试框架gtest学习&#xff08;二&#xff09;—— 认识断言-CSDN博客 本节我们介绍gtets的事件机制 虽然 Google Test 的核心是用来编写单元测试和断言的&#xff0c;但它也允许在测试执行过程中进行事件的钩取和自定义&#xf…

在k8s上部署Crunchy Postgres for Kubernetes

目录 一、前言二、安装Crunchy Postgres for Kubernetes三、部署一个简单的postgres集群四、增加pgbouncer五、数据备份六、备份恢复七、postgres配置参数八、数据导入九、权限管理 一、前言 Crunchy Postgres可以帮助我们在k8s上快速部署一个高可用、具有自动备份和恢复功能的…

python中Pandas操作excel补全内容

补全ID、InStore、Date import random from datetime import datetime, timedeltaimport pandas as pdfile_path r"C:\Users\xb\Desktop\Books_1.xlsx" books pd.read_excel(iofile_path, skiprows3, usecols"C:F", dtype{"ID": str, "I…

高级 SQL 技巧讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; SQL&#xff08;结构化查询语言&#xff09;是管理和操作数据库的核心工具。从基本的查询语句到复杂的数据处理&#xff0c;掌握高级 SQL 技巧不仅能显著提高数据分析的效率&#xff0c;还能解决业务中的复…