文章目录

  • C语言
    • 值传递
    • 地址传递
  • C++
    • 引用传递

C语言

值传递

这种方式使用变量、数组元素作为函数参数,实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元,这种传递方式称为“参数的值传递”。在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。
例子:

#include <stdio.h>
void swap(int x, int y) {int tmp;tmp = x;x = y;y = tmp;printf("x = %d, y = %d\n", x, y);
}
int main() {int a = 10;int b = 20;swap(a, b);printf("a = %d, b = %d\n", a, b);return 0;
}

运行结果:
在这里插入图片描述
对上面的例子进行修改:

#include <stdio.h>void test(int x) {x = 1024;printf("test函数内部 x = %d\n", x);printf("x的地址为:%p\n", &x); 
} int main() {int x = 1;printf("调用test前 x = %d\n", x);  //1test(x);  //1024printf("x的地址为:%p\n", &x);printf("调用test后 x = %d\n", x);  //1return 0;
} 

可以看出运行结果与我们之前描述的一致。

地址传递

这种方式使用数组名或者指针作为函数参数,传递的是该数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,这种传递方式称为“参数的地址传递”。
地址传递的特点是形参并不存在存储空间,编译系统不为形参数组分配内存。数组名或指针就是一组连续空间的首地址。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该首地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化

#include <stdio.h>// 修改1:参数改为指针类型
void test(int *px) { // px指向main中的x*px = 1024; // 通过指针修改原变量printf("test函数内部 *px = %d\n", *px); // 1024printf("px的值为:%p (指向main中的x)\n", px); printf("px自身地址为:%p\n", &px); // 指针自身的地址,也就是指向px的指针,又叫做二级指针// int **ppx = &px;
} int main() {int x = 1;printf("调用test前 x = %d\n", x); //1printf("x的地址为:%p\n", &x);// 修改2:传递x的地址test(&x); // 传递x的地址printf("调用test后 x = %d\n", x); //1024 被修改了return 0;
}

运行结果:
在这里插入图片描述
此外,如果想修改main函数中x的值,还有两种办法。

  1. 直接返回修改后的值
    这种方法适用于单返回值的情况:
#include <stdio.h>int test(int x) {x = 1024; // 修改局部副本return x; // 返回新值
} int main() {int x = 1;printf("调用test前 x = %d\n", x); //1// 获取返回值并赋值给xx = test(x); printf("调用test后 x = %d\n", x); //1024return 0;
}

在这里插入图片描述
2. 使用全局变量

#include <stdio.h>int x; // 全局变量void test() {x = 1024; // 直接修改全局变量
} int main() {x = 1;printf("调用test前 x = %d\n", x); //1test(); // 不需要传递参数printf("调用test后 x = %d\n", x); //1024return 0;
}

但是,使用全局变量通常不是好的做法,因为它使得程序难以维护和理解。

C++

引用传递

<cstdio> 是 C++ 标准库中的一个头文件,它包含了 C 语言标准 I/O 库的 C++ 封装,主要用于文件的输入和输出操作。
C++引用声明的语法为:数据类型& 引用名 = 被引用变量;,作为函数参数:返回值类型 函数名(数据类型& 参数名)
理解:引用不是新变量,而是已存在变量的别名,引用在编译后直接绑定到目标地址,不产生额外内存分配。
形式上,声明的形式具有相似性:

int* ptr;   // 指针声明
int& ref;   // 引用声明// 清晰区分参数类型
void func(int param);     // 值传递
void func(int* param);    // 指针传递
void func(int& param);    // 引用传递

代码如下:

#include <iostream>using namespace std;int main() {int person = 10;         // 实体:变量personint& idCard = person;    // 引用idCard是person的别名person = 20;             // 通过原名修改cout << idCard;          // 输出20 - 通过别名访问idCard = 30;             // 通过别名修改cout << person;          // 输出30 - 原名也随之改变int original = 42;int& alias = original;cout << "变量地址: " << &original << endl;  cout << "引用地址: " << &alias << endl;     
}

在这里插入图片描述

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

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

相关文章

设计模式-三大工厂

工厂模式有三种&#xff0c;分别是简单工厂模式、工厂方法模式、抽象工厂模式。三种模式从前到后越来越抽象&#xff0c;也更具有一般性。 设计模式 优点 缺点 简单工厂 1.实现了对责任的分割&#xff0c;它提供了专门的工厂类用于创建对象。 1.违背了开闭原则。 2.使用了…

在 AI 工具海洋中掌舵:Cherry Studio 如何成为你的统一指挥中心

01 被 AI 工具包围的知识工作者现状 在这个 AI 爆发的时代&#xff0c;知识工作者的工具库正经历前所未有的扩容。以我为例&#xff0c;按平台类型梳理日常使用的 AI 工具&#xff0c;已然形成三层矩阵&#xff1a; 「云端智能助手」&#xff1a;Kimi、豆包、ChatGPT、Gemini…

Java 线程池技术深度解析与代码实战

为什么线程池总在深夜崩溃&#xff1f; 昨天我这项目又经历了一次爆破——路由推送服务突然崩溃&#xff0c;排查发现线程池队列堆积了几万任务直接把内存撑爆。早上起来看见人都麻了&#xff0c;线程池用不好&#xff0c;分分钟变系统炸弹。今天我们就来系统梳理线程池的实战…

Gradio可视化构建聊天机器人

Gradio是一个Python库&#xff0c;专门用于快速构建和部署机器学习模型的Web界面。它的名字来源于"Gradient"&#xff08;梯度&#xff09;&#xff0c;最初是为了让机器学习开发者能够快速展示他们的模型而设计的。 1. Gradio是什么&#xff1f; 核心概念 快速原…

selenium如何识别条形验证码,自动输入验证码

在自动化测试或网页爬取中&#xff0c;识别验证码是常见的难点。Selenium 本身不具备直接识别验证码的能力&#xff0c;但可以通过结合第三方工具、OCR 技术或人工介入等方式解决。以下是多种可行方案的详细实现思路及代码示例&#xff1a; 一、方案一&#xff1a;使用第三方验…

SAP将指定EXCEL工作SHEET的数据上传到内表

SAP将指定EXCEL工作SHEET的数据上传到内表 本文描述了一个SAP ABAP类方法upload_excel_2internaltab&#xff0c;用于将Excel文件数据上传到内部表。主要功能包括&#xff1a; 验证Excel行列范围有效性&#xff0c;若起始值大于结束值则抛出异常检查文件是否存在&#xff0c;支…

Spring Boot(九十三):Springboot 整合cfx实现webservice接口

1 服务端 最近项目改造,有一些老项目接口协议是webservice soap1.1,这就需要我们提供webservice服务接口。在Spring Boot中整合CFX(CXF框架)以实现Web服务客户端与服务端的功能,可以分为几个步骤。下面我将详细介绍如何在Spring Boot中设置一个Web服务端点,使用Apache CX…

Triton server的部署、构建、backend插件机制整体介绍

目录 0 引言 1 什么是Trition inference server 2 Trition inference server部署 2.1 下载server 2.2 下载模型 2.3 实验 3 triton inference server的构建 3.1 build时候需要哪些repo 3.2 构建过程做了什么 3.3 构建体验 4 阅读readme整体了解下backend机制 4.1 什…

Paimon在各大公司生产实践和优化总结

这是一篇汇总和个人学习文章&#xff0c;主要目的是总结一下Paimon在各大公司的落地做一个学习笔记。 本文的主要内容是关于Paimon在各大公司包括Vivo、Shopee、阿里、抖音等公司的落地实践&#xff0c;文末有文章来源地址&#xff0c;内容大概分为几个部分&#xff1a; 1.引…

简析自动驾驶产业链及其核心技术体系

一、自动驾驶产业链 自动驾驶产业链可以细分为感知层、决策层、执行层以及通信层等多个环节。上游部分主要包括提供环境感知所需的各种传感器&#xff08;如激光雷达、毫米波雷达、摄像头等&#xff09;、高精度地图服务、定位系统以及其他相关硬件设备&#xff1b;中游涵盖了…

第一节 布局与盒模型-Flex与Grid布局对比

一、核心特性对比​​ 1. ​​布局维度​​ ​​Flex 布局​​&#xff1a; ​​一维布局​​&#xff1a;仅支持单方向&#xff08;水平或垂直&#xff09;的排列&#xff0c;通过 flex-direction 控制主轴方向&#xff08;row 或 column&#xff09;。​​适用场景​​&…

国产USRP X410 PRO/PRO+(相参版):宽频段、大带宽、多通道的4×4高性能软件无线电设备

国产USRP X410 PRO/PRO(相参版)高性能软件无线电&#xff0c;作为USRP X410的进阶版本&#xff0c;X410 PRO/PRO核心均升级为Xilinx XCZU48DR FPGA芯片&#xff0c;显著提升了信号处理能力。平台延续了Xilinx Zynq UltraScale RFSoC的先进架构&#xff0c;集成四核ARM处理器及高…

Mac电脑-Office 2024 长期支持版(Excel、Word、PPT)

Office 2024 mac 是一款专为苹果电脑用户设计的高性能、高安全性的办公软件套装 集成了Word、Excel、PowerPoint、Outlook等经典应用&#xff0c;为用户提供了一站式的办公解决方案。 不仅继承了Office系列一贯的卓越性能&#xff0c;还在功能性和用户体验上进行了全面升级。…

vue2通过leaflet实现图片点位回显功能

需求&#xff1a;在图片上标点了&#xff0c;需要根据标记点在图片上进行回显功能&#xff0c;并且不会根据窗口大小导致标记点移位 1.效果 2.下载插件 用到的是leaflet插件&#xff1a;一个交互式地图 JavaScript 库&#xff0c;我下载是 "leaflet": "^1.9.4&…

OmniDocBench:一键评测PDF解析算法

绝大多数文档格式都能无损转换至PDF&#xff0c;解决了PDF解析&#xff0c;也就相当于解决了绝大多数文档的解析。所以&#xff0c;PDF解析算法是文档服务的基石技术。 PDF解析算法目前有两类技术路线 pipeline方法&#xff0c;整合layout analysis, OCR, formula/table reco…

[按键精灵安卓/ios脚本插件开发] 遍历获取LuaAuxLib函数库命令辅助工具

LuaAuxLib库 LuaAuxLib是按键精灵所有内置命令所在的库文件&#xff0c;有多种方式来获取LuaAuxLib库下的函数命令&#xff0c;例如反编译按键精灵手机端库文件等。这里咱们来介绍一种浅显易懂的方式来获取&#xff0c;直接for循环遍历获取函数名。 ScanLuaAuxLib 我们写一个自…

深度学习和计算机视觉的关系的理解

深度学习和计算机视觉的关系 深度学习作为人工智能的重要分支&#xff0c;近年来在计算机视觉领域取得了革命性突破。计算机视觉的核心任务包括图像分类、目标检测、语义分割等&#xff0c;而深度学习通过神经网络模型自动学习图像特征&#xff0c;极大提升了这些任务的准确率…

springboot开发项目 SLF4J+Logback日志框架集成【最终篇】

在这篇文章之前&#xff0c;实际对于 springboot和SLF4JLogback日志框架的使用 我已经分享过3篇关于springboot 日志的文章了。为什么会在写这篇最终篇&#xff0c;因为 前3篇分享的关于springBoot框架日志的配置方案&#xff0c; 发现了一个问题&#xff1a;只有项目启动的时候…

phpstudy无法启动apache,80端口被占用,完美解决

phpstudy无法启动apache&#xff0c;80端口被占用&#xff0c;完美解决 解决方法一(最推荐) 依次点击网站-管理-修改 将端口由80改为81&#xff0c;再点击确认后即可重新启动apache。 需要注意的是&#xff0c;网站的访问由127.0.0.1变为127.0.0.1:81。默认是80的端口所以可以不…

Loggers 配置解析(log4j.xml)

Loggers 配置解析 我们通过下面的例子来理解 log4j 的 Loggers 配置是如何决定日志输出规则的。 <Loggers><!-- 根Logger&#xff1a;全局配置 --><Root level"debug"><AppenderRef ref"consoleAppender" level"info"/&g…