值传递和引用传递

news/2024/10/3 20:04:10/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

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

值和引用传递本质一样

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

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

不同编程语言的参数传递

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

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

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

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

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

值传递示例

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

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

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

class="img-center">c="https://img-blog.csdnimg.cn/img_convert/30a4e5a63d2b06cc8142bd95074db082.png" width="429" />

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


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

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

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

class="blog-extension-box">

http://www.ppmy.cn/news/1533609.html

相关文章

深圳大学 Github 学生认证并免费使用 Copilot AI编程工具(超详细)

文章目录 01 注册学生邮箱并添加邮箱到Github1.1 注册学生邮箱1.2 绑定学生邮箱 02 修改 Github profile 信息03 申请学生认证[^2]04 配置 Copliot05 VS code 使用 Copilot 01 注册学生邮箱并添加邮箱到Github 1.1 注册学生邮箱 对于深圳大学的学生来说&#xff0c;学校已经帮…

pytorch千问模型源码分析

class Qwen2Config(PretrainedConfig): model_type = "qwen2" # 表明在推理过程中,对于某些操作,模型或库会忽略 past_key_values 的存在。这对于控制序列生成的行为是非常有用的, # 特别是在需要初始化生成过程或格式化输出结果时。然而,实际应用中…

oracle解决关联查询报invalid number问题

出现问题的原因和背景 oracle进行关联查询的时候因为字段存在多个用逗号切割的id&#xff0c;导致查询的过程中报无效数字或非法数字 问题复现 新建表A CREATE TABLE "A" (id NUMBER NOT NULL,name VARCHAR2(255 BYTE) )INSERT INTO "A" VALUES (1, 上海…

职场人情世故

1.人走茶凉本是常态&#xff0c;朋友是流动的&#xff0c;人是会变的&#xff0c;走的人不必挽留。 2.别人不问你的事&#xff0c;千万不要随意去指点别人&#xff0c;因为你不知道某些事的复杂程度。 3.不要太在乎面子&#xff0c;不管别人如何对你指指点点&#xff0c;你都…

足球青训俱乐部管理:Spring Boot技术驱动

摘 要 随着社会经济的快速发展&#xff0c;人们对足球俱乐部的需求日益增加&#xff0c;加快了足球健身俱乐部的发展&#xff0c;足球俱乐部管理工作日益繁忙&#xff0c;传统的管理方式已经无法满足足球俱乐部管理需求&#xff0c;因此&#xff0c;为了提高足球俱乐部管理效率…

基于单片机人体反应速度测试仪系统

** 文章目录 前言概要设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…

Android Webview和ScrollView冲突和WebView使用总结

1.因为Webview和ScrollView都用滑动事件&#xff0c;导致webview很难被滑动&#xff0c;即使被滑动了一点也非常不顺畅2.解决滑动冲突问题后发现&#xff0c;如果webview嵌套的html中含有轮播图等还是有问题。 使用自定义ScrollWebView解决这个问题 public class ScrollWebVi…

初识算法 · 双指针(2)

目录 前言&#xff1a; 盛最多水的容器 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 有效三角形的个数 题目解析&#xff1a; 算法原理&#xff1a; 算法编写&#xff1a; 前言&#xff1a; 本文介绍两个题目&#xff0c;盛最多水的容器和有效三…