值传递和引用传递

值传递和引用传递是函数参数传递的两种类型,一般而言,基本数据类型都是值传递,数组和对象采用引用传递减少对象复制开销,但也有特例。

值和引用传递本质一样

  • 值传递是拷贝值到函数参数,引用传递是拷贝引用(或者对象的指针)到函数参数,把引用当成值,二者无差异。基本数据类型值传递,函数参数已经包含了值的全部信息,引用传递传地址,不包含指向的数据结构内部。

  • 传递引用不止可读数据,也可改写数据,同时开销还小,这是引用传递最大的作用。联想一下CPU RIP指针或RBP/RSP指针,指哪打哪,简单直接。

不同编程语言的参数传递

对于整型、字符、枚举、浮点数等基本数据类型,都按照值传递,如下主要比较复杂类型。

  • C/C++数组按引用(指针)传递,一般函数会带额外的数组大小参数。C语言struct默认按值传递,C++保持对C语言的兼容,struct和类对象默认按值传递,可以改成指针或引用。

  • C#数组全部是引用传递,结构体是按值传递,可以用ref或out指示按引用传递,类对象全部是引用传递。

  • Java数组和类对象都是引用传递,没有结构体。

  • Ada在参数加上out修饰表明是引用传递。

值传递示例

以C语言为例,我们来研究调用一个简单的加法函数堆栈的层次。如下调用add(1, 2):

int add(int a, int b)
{
int sum;
sum = a + b; return sum;
}

  • 如下面图示,下划线标注的0x006FFA80/0x006FFA84是调用add函数的参数地址,分别是1和2, 方框开头是0x006FFA74, 是add函数内部形参的首地址,也对应1和2, 两个地址是独立的。

注意:在Debug版本可能不易观察,因编译器可能加入一些Debug参数,在VS2019上,有/JMC, /GS, /RTC, 它们插入了不少防范的资讯,导致堆栈信息不清晰。建议用Release版本,并关掉优化(/Od).


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

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

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

相关文章

矿石运输船数据集、散货船数据集、普通货船数据集、集装箱船数据集、渔船数据集以及客船数据集

海船:用于船只检测的大规模精准标注数据集 我们很高兴地介绍一个新的大规模数据集——海船,该数据集专为训练和评估船只目标检测算法而设计。目前,这个数据集包含31,455张图像,并涵盖了六种常见的船只类型,包括矿石运…

Python基础语句教学

Python是一种高级的编程语言,由Guido van Rossum于1991年创建。它以简单易读的语法和强大的功能而闻名,被广泛用于科学计算、Web开发、数据分析等领域。 Python的应用领域广泛,可以用于开发桌面应用程序、Web应用、游戏、数据分析、人工智能等…

react项目中引入最新版本eslint

目的 我们讲eslint引入项目,无非就是让我们在写代码的过程当中,可以给我们一些友好的提示,来检查我们代码的书写合理性,以及一些代码书写习惯的统一;最新版本9.x以上的eslint适配我们的项目 安装 # 通过eslint官方提…

人工智能辅助的神经康复

人工智能辅助的神经康复是通过应用人工智能(AI)技术来改善神经系统损伤患者的康复过程。此领域结合了深度学习、数据分析和机器人技术,旨在提升康复效果、个性化治疗方案和监测进展。以下是该领域的关键组成部分和应用: 1. 康复评…

计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

往期热门项目回顾: 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…

Python的异步编程

什么是协程? 协程不是计算机系统提供,程序员人为创造。 协程也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。 实现协程有那么几种方法: greenlet&…

Centos怎么执行脚本

方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本 cd /data/shell ./hello.sh 方法二:以绝对路径的方式去执行bash shell脚本 /data/shell/hello.sh 方法三:直接使用bash 或sh 来执行…

JDK9与JDK8对比

JDK 9 带来了很多显著的新特性,较早期的版本有了非常多的提升和优化。以下将以清晰的对比方式讲解 JDK 9 相比旧版本的优势,并通过实际示例展示如何利用新特性。 1. 模块化系统(Project Jigsaw) JDK 8 及之前: 所有的…

从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之二:生产服务器的备份操作

从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之二:生产服务器的备份操作 目录 从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之二:生产服务器的备份操作一、创建 pfile 文件二、创建备份…

CSS外边距

元素的外边距(margin)是围绕在元素边框以外(不包括边框)的空白区域,这片区域不受 background 属性的影响,始终是透明的。 为元素设置外边距 默认情况下如果不设置外边距属性,HTML 元素就是不会…

CSS 中 object-fit 的 cover 和 contain

前言&#xff1a;object-fit 属性用于指定可替换元素&#xff08;如<img>、<video>等&#xff09;如何适应其容器。 一、视觉效果 1. object-fit: cover 此值会使被替换元素完全覆盖容器&#xff0c;同时保持其宽高比。这意味着元素可能会被裁剪以适应容器的尺寸…

Linux shell编程学习笔记84:tee命令——显示保存两不误

0 引言 在前面的学习笔记中&#xff0c;我们经常使用echo命令和输出重定向来生成脚本文件或演示文件&#xff0c;其实Linux提供了一个可以从标准输入读取数据&#xff0c;并输出成文件的命令——tee。 1 tee命令 的帮助信息、功能、命令格式、选项和参数说明 1.1 tee命令 的…

OpenCV-指纹识别

文章目录 一、意义二、代码实现1.计算匹配点2.获取编号3.获取姓名4.主函数 三、总结 一、意义 使用OpenCV进行指纹识别是一个复杂且挑战性的任务&#xff0c;因为指纹识别通常需要高精度的特征提取和匹配算法。虽然OpenCV提供了多种图像处理和计算机视觉的工具&#xff0c;但直…

软件测试学习笔记丨Pytest 学习指南

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32336 基本介绍 pytest框架是一个成熟&#xff0c;全面的测试框架&#xff0c;具有非常丰富的第三方插件&#xff0c;并且可以自定义扩展 比如&#xff1a;pytest-selenium , pytest-html ,…

MySQL高阶2004-职员招聘人数

目录 题目 准备数据 分析数据 实现 题目 一家公司想雇佣新员工。公司的工资预算是 70000 美元。公司的招聘标准是&#xff1a; 雇佣最多的高级员工。在雇佣最多的高级员工后&#xff0c;使用剩余预算雇佣最多的初级员工。 编写一个SQL查询&#xff0c;查找根据上述标准雇…

elasticsearch 写入新数据测试(二)

背景:elasticsearch单个node节点写入数据-CSDN博客 需要设置密码才能作为外部调用,不设置我不会用。设置方法见上一篇。 设置密码出现如下问题: Unexpected response code [503] from calling PUT http://172.19.0.1:9200/_security/user/apm_system/_password?pretty …

net core mvc 数据绑定 《1》

其它的绑定 跟net mvc 一样 》》MVC core 、framework 一样 1 模型绑定数组类型 2 模型绑定集合类型 3 模型绑定复杂的集合类型 4 模型绑定源 》》》》 模型绑定 使用输入数据的原生请求集合是可以工作的【request[],Querystring,request.from[]】&#xff0c; 但是从可读…

unity一键注释日志和反注释日志

开发背景&#xff1a;游戏中日志也是很大的开销&#xff0c;虽然有些日志不打印但是毕竟有字符串的开销&#xff0c;甚至有字符串拼接的开销&#xff0c;有些还有装箱和拆箱的开销&#xff0c;比如Debug.Log(1) 这种 因此需要注释掉&#xff0c;当然还需要提供反注释的功能&am…

ide 使用技巧与插件推荐

ide 使用技巧与插件推荐 一、IDE 使用技巧 1. 快捷键 掌握常用快捷键&#xff1a; Windows: 使用 Ctrl、Alt 和 Shift 的组合。 Mac: 使用 Cmd、Option 和 Shift。 常用快捷键示例&#xff1a; VS Code: Ctrl P: 快速打开文件。 Ctrl Shift P: 打开命令面板。 Ctrl /…

前端 vue3 对接科大讯飞的语音在线合成API

主要的功能就是将文本转为语音&#xff0c;可以播放。 看了看官方提供的demo&#xff0c;嗯....没看懂。最后还是去网上找的。 网上提供的案例&#xff0c;很多都是有局限性的&#xff0c;我找的那个他只能读取第一段数据&#xff0c;剩下的不读取。 科大讯飞的接口&#xf…