关于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,使得函数内部的操作能够直接影响到传入的原始指针变量,从而实现指针地址的交换等对指针变量本身进行的操作。

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

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

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

相关文章

Windows 软件之 FFmpeg

文章目录 前言1 FFmpeg 视频处理1.1 编解码1.2 其它视频编辑命令1.3 视频抽帧 2 FFmpeg 音频处理3 FFmpeg 图片处理3.1 编解码3.2 拼接图片3.3 图片合成视频 附录1&#xff1a;mediainfo.ps1 前言 FFmpeg 是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的…

Android okhttp 网络链接各阶段监控

步骤 1: 添加依赖 在项目的 build.gradle 文件中&#xff0c;添加 OkHttp 依赖&#xff1a; implementation com.squareup.okhttp3:okhttp:4.11.0 步骤 2: 创建自定义的 EventListener 创建一个自定义的 EventListener 类&#xff1a; import android.util.Log import okht…

【Java】字节码文件

字节码文件组成部分 1、基本信息 1.1 Magic 魔数 文件是无法通过文件扩展名来确定文件类型的&#xff0c;文件扩展名可以随意修改&#xff0c;不影响文件的内容。软件使用文件的头几个字节&#xff08;文件头&#xff09;去校验文件的类型&#xff0c;如果软件不支持该种类型就…

Easyexcel(3-文件导出)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09; 响应头设置 通过设置文件导出的响应头&#xff0c;可以自定义文件导出的名字信息等 //编码格式为UTF-8 response.setC…

【机器学习】朴素贝叶斯算法

目录 什么是朴素贝叶斯算法&#xff1f; 算法引入 贝叶斯定理 朴素贝叶斯分类器 工作原理 优缺点 应用场景 实现示例 基本步骤&#xff1a; 在机器学习的世界里&#xff0c;朴素贝叶斯算法以其简单性和高效性而著称。尽管它的名字听起来有点复杂&#xff0c;但实际上…

机器翻译基础与模型 之二: 基于CNN的模型

一、CNN网络 相比于全连接网络&#xff0c;卷积神经网络最大的特点在于具有局部连接&#xff08;Locally Connected&#xff09;和权值共享&#xff08;Weight Sharing&#xff09;的特性。 1.1 卷积核与卷积操作 1.2 步长与填充 1.3 池化 以上关于CNN的基础概念和技术就不…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发&#xff0c;可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握&#xff0c;如果快速上手数据库开发&#xff0c;可以先按照本文介绍的方式使用JdbcTemplat…

C总结测评

测评代码&#xff1a;month_11/test_19/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 第一题&#xff1a;该程序输出的是多少&#xff1f; #include <stdio.h> int main() {unsigned char i 7;//0~255int j 0;for (; i > 0; i - 3){j;}printf("%d\n",…

神经网络中常用的激活函数(公式 + 函数图像)

激活函数是人工神经网络中的一个关键组件&#xff0c;负责引入非线性&#xff0c;从而使神经网络能够学习和表示复杂的非线性关系。没有激活函数&#xff0c;神经网络中的所有计算都是线性变换&#xff0c;而线性模型的表达能力有限&#xff0c;无法处理复杂的任务。 激活函数…

在CentOS中,通过nginx访问php

其实是nginx反向代理到php-fpm&#xff0c;就像nginx反向代理到tomcat。 1、安装PHP-FPM 1.1 安装 yum install php yum install php-fpm php-common 这里只安装了php-fpm&#xff0c;根据需要安装php模块&#xff0c;比如需要访问mysql则添加安装 php-mysqlnd。 1.2 启动…

前端—Cursor编辑器

在当今快速发展的软件开发领域&#xff0c;效率和质量是衡量一个工具是否优秀的两个关键指标。今天&#xff0c;我要向大家推荐一款革命性的代码编辑器——Cursor&#xff0c;它集成了强大的AI功能&#xff0c;旨在提高开发者的编程效率。以下是Cursor编辑器的详细介绍和推荐理…

windows远程桌面打开rdp显卡调用

前情提要 服务器在公网环境&#xff0c;带宽只有30M。 远程桌面多开图形业务调试&#xff0c;设置RDP服务端使用GPU。 压缩传输带宽避免造成卡顿。 如果是内网&#xff0c;也可以用&#xff0c;还可以提供一个注册表键值&#xff0c;修改后提高fps帧率&#xff08;公网不推…

使用C++和QT开发应用程序入门以及开发实例分享

目录 1、搭建开发环境(VS2010和QT4.8.2) 2、创建一个QT窗口 3、在QT窗口中添加子窗口 4、QT界面布局 5、QT信号(SIGNAL)和槽(SLOT) 6、最后 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/…

Spark SQL大数据分析快速上手-完全分布模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 完全分布模式也叫集群模式。将Spark目…

php:使用socket函数创建WebSocket服务

一、前言 闲来无事&#xff0c;最近捣鼓了下websocket&#xff0c;但是不希望安装第三方类库&#xff0c;所以打算用socket基础函数创建个服务。 二、构建websocket服务端 <?phpclass SocketService {// 默认的监听地址和端口private $address 0.0.0.0;private $port 8…

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients&#xff08;系数&#xff09;作用1.…

(十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器

目录 1.业务逻辑实现 1.1 登录校验技术——会话 1.1.1Cookie 1.1.2session 1.1.3JWT令牌技术 2.参数配置化 3.yml格式配置文件 4.过滤器Filter 5.拦截器Interceptor 1.业务逻辑实现 Day10-02. 案例-部门管理-查询_哔哩哔哩_bilibili //Controller层/*** 新增部门*/Pos…

数字IC后端设计实现之Innovus place报错案例 (IMPSP-9099,9100三种解决方案)

最近吾爱IC社区星球会员问到跑place_opt_design时会报错退出的情况。小编今天把这个错误解决办法分享给大家。主要分享三个方法&#xff0c;大家可以根据自己的实际情况来选择。 数字IC后端低功耗设计实现案例分享(3个power domain&#xff0c;2个voltage domain) **ERROR: (I…

麒麟网络负载均衡与高可用方案实践

安装 teamd 包。 yum -y install teamd Copy 一、配置TEAMING 查看两个网卡信息 ifconfig Copy 注意&#xff1a;根据实际网卡设备名称情况调整代码&#xff01;不同环境下网卡名称略有不同&#xff01; 根据查询的结果&#xff0c;两张网卡设备名称分别为 enp0s2 和 enp…

【SpringBoot】26 实体映射工具(MapStruct)

Gitee 仓库 https://gitee.com/Lin_DH/system 介绍 现状 为了让应用程序的代码更易于维护&#xff0c;通常会将项目进行分层。在《阿里巴巴 Java 开发手册》中&#xff0c;推荐分层如下图所示&#xff1a; 每层都有对应的领域模型&#xff0c;即不同类型的 Bean。 DO&…