C语言入门系列:从内存原理看函数的值传递和引用传递

文章目录

  • 一,值传递
  • 二,引用传递
  • 三,从内存原理看值传递和引用传递的区别
    • 1 值传递内存示意图
    • 2 引用传递内存示意图
  • 参考文献

函数参数用于向函数传递数据,C语言支持两种传递方式:值传递和引用传递。

一,值传递

传递参数的副本,函数内对参数的修改不影响原变量。

void swapByValue(int x, int y) {int temp = x;x = y;y = temp; // 交换操作仅影响局部副本
}int main() {int a = 5, b = 10;swapByValue(a, b);printf("a = %d, b = %d\n", a, b); // 输出不变:a = 5, b = 10
}

上述代码,通过值传递调用函数swapByValue(int x, int y),表面上起到了交换a和b的值的作用,实则并未改变a和b的值。

这是因为调用函数时是将ab的值复制一份后,赋值给形参变量xy,之后对xy的操作不会影响ab的值。

二,引用传递

传递参数的地址,通过指针实现,函数内可通过地址修改原变量。

void swapByReference(int* x, int* y) {int temp = *x;*x = *y;*y = temp; // 实际交换变量的值
}int main() {int a = 5, b = 10;swapByReference(&a, &b);printf("a = %d, b = %d\n", a, b); // 输出交换后:a = 10, b = 5
}

上述代码,通过值传递调用函数swapByValue(int* x, int* y),表面上起到了交换a和b的值的作用,实际上的确起到了这个作用。

这是因为调用函数时是将ab的地址传递给了指针变量xy,函数体内通过运算符*xy进行运算,本质上操作xy指向的内存中的数据,也即是变量ab的数据。

三,从内存原理看值传递和引用传递的区别

C代码在执行时,以函数为单位创建栈帧,栈帧中为变量分配内存空间,值传递和引用传递的根本区别在于变量的内存空间存储的数据不同。

1 值传递内存示意图

void swapByValue(int x, int y) {int temp = x;x = y;y = temp; // 交换操作仅影响局部副本
}int main() {int a = 5, b = 10;swapByValue(a, b);printf("a = %d, b = %d\n", a, b); // 输出不变:a = 5, b = 10
}

对于上述值传递代码,如下图所示,main函数调用swapByValue函数,采用值传递,相当于把main栈帧变量ab的内存中的值copy到swapByValue栈帧中变量xy的内存区域,之后swapByValue函数中操作xy的内存中存储的值,并不会影响main栈帧中变量ab的内存中的值。

在这里插入图片描述

2 引用传递内存示意图

void swapByReference(int* x, int* y) {int temp = *x;*x = *y;*y = temp; // 实际交换变量的值
}int main() {int a = 5, b = 10;swapByReference(&a, &b);printf("a = %d, b = %d\n", a, b); // 输出交换后:a = 10, b = 5
}

对于如上引用传递代码,如下图所示,传递给swapByValue栈帧中变量xy的值是main栈帧中变量ab的地址,swapByValue函数中通过星号运算符*结合xy中存储的地址值,找到main栈帧中变量ab,并对其进行读写,所以main栈帧中变量ab的值会交换。

在这里插入图片描述

参考文献

1,https://blog.csdn.net/qq_40507857/article/details/114966115?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171918705616800222879077%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=171918705616800222879077&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogbaidu_landing_v2~default-3-114966115-null-null.nonecase&utm_term=%E5%80%BC%E4%BC%A0%E9%80%92%E5%92%8C%E5%BC%95%E7%94%A8%E4%BC%A0%E9%80%92c&spm=1018.2226.3001.4450

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

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

相关文章

工程文档CAD转换必备!在 Java 中将 DWG 转换为 JPG

Aspose.CAD 是一个独立的类库,以加强Java应用程序处理和渲染CAD图纸,而不需要AutoCAD或任何其他渲染工作流程。该CAD类库允许将DWG, DWT, DWF, DWFX, IFC, PLT, DGN, OBJ, STL, IGES, CFF2文件、布局和图层高质量地转换为PDF和光栅图像格式。 Aspose AP…

Synchronized、volatile与ReentrantLock:比较这些同步机制在Java并发编程中的应用和区别

在Java并发编程中,确保多个线程安全地访问共享资源是至关重要的。为实现这一目标,Java提供了多种同步机制,其中synchronized、volatile和ReentrantLock是最常用的几种。下面,我们将从技术难点、面试官关注点、回答吸引力以及代码举…

如何用家政服务小程序源码系统 快速搭建家政自己接单的软件?

随着移动互联网的快速发展,线上预约服务已成为家政行业的新趋势。然而,许多家政企业面临着信息不透明、服务质量参差不齐、管理效率低下等问题。家政服务小程序系统,可以帮助商家快速搭建自己的接单软件,提升服务效率,…

嵌入式学习——Linux操作系统——文件编程练习

1.使用fread和fwrite方式完成任意普通文件的拷贝功能。 模拟 文件下载 #include <stdio.h>void do_copy(FILE *fp_s,FILE *fp_d) {char buf[100] {0};int ret;while (ret fread(buf,sizeof(char),sizeof(buf),fp_s))fwrite(buf,sizeof(char),ret,fp_d); }//./a.out sr…

开源网安参编的《代码大模型安全风险防范能力要求及评估方法》发布

​代码大模型在代码生成、代码翻译、代码补全、错误定位与修复、自动化测试等方面为研发人员带来了极大便利的同时&#xff0c;也带来了对安全风险防范能力的挑战。基于此&#xff0c;中国信通院依托中国人工智能产业发展联盟&#xff08;AIIA&#xff09;&#xff0c;联合开源…

深圳比创达|EMC电磁兼容性行业:电子设备质量的“守门员”

随着科技的不断进步和电子产品的普及&#xff0c;电磁兼容性&#xff08;EMC&#xff09;问题愈发受到行业内外的高度关注。EMC作为衡量电子设备在电磁环境中能否正常工作的重要指标&#xff0c;对于保障设备稳定运行、减少电磁干扰、提升产品质量具有重要意义。 一、EMC电磁兼…

水产养殖监测系统解决方案有哪几部分

随着科技的不断进步&#xff0c;水产养殖行业也迎来了智能化、信息化的新时代。在这一背景下&#xff0c;水产养殖监测系统解决方案应运而生&#xff0c;为养殖企业提供了科学、高效的管理工具。 一、系统概述 水产养殖监测系统是通过现代传感技术、数据分析技术以及互联网通信…

微信小程序(跳转)

在微信小程序中&#xff0c;常用的跳转方式包括以下几种 1.页面跳转 可以使用wx.navigateTo、wx.redirectTo和wx.reLaunch方法实现页面的跳转。 wx.navigateTo&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面。wx.redirectTo&#xff1a;关闭当前页面&#xff…

【每日一题】503. 下一个更大元素 II

思路&#xff08;c&#xff09; 使用单调栈的解法&#xff0c;单调栈里面存的是大于当前元素的index&#xff0c;不是直接存值。但是这个题目是一个循环数组&#xff0c;可以在后面补一段前面的内容&#xff0c;这样就可以正常遍历。将每个位置对应的结果存在map中 后面循环…

mysql的语句查询顺序、耗时分析以及查询调优技巧

在MySQL中&#xff0c;SQL查询语句的执行顺序、耗时分析以及查询调优是优化数据库性能的重要方面。以下是关于这些方面的详细解释。 1. SQL查询语句的执行顺序 虽然我们编写SQL语句的顺序通常是 SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -…

前后端分离后灰度发布实现方式

1、什么是灰度发布 灰度发布, 也叫金丝雀发布。是指在黑与白之间&#xff0c;能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式&#xff0c;让一部分用户继续用A&#xff0c;一部分用户开始用B&#xff0c;如果用户对B没有什么反对意见&#xff0c;那么逐步扩大范围&…

MySQL 教程

MySQL 教程 目录 简介安装 MySQL WindowsmacOSLinux 连接 MySQL 命令行客户端图形化工具 基础操作 创建数据库删除数据库选择数据库 表的操作 创建表删除表插入数据查询数据更新数据删除数据 高级操作 索引视图存储过程触发器 用户管理 创建用户授权删除用户 备份与恢复 备份…

Vatee万腾平台:技术引领,智能先行

在科技日新月异的今天&#xff0c;智能技术正以前所未有的速度改变着我们的世界。在众多科技平台中&#xff0c;Vatee万腾平台凭借其卓越的技术实力和前瞻性的战略眼光&#xff0c;成为了智能技术领域的佼佼者。它始终坚持“技术引领&#xff0c;智能先行”的理念&#xff0c;推…

如何在 Odoo 17 库存模块中进行质量控制

质量控制是确保制造产品质量符合最终要求的关键步骤。有效的质量控制能够提高客户满意度。在生产过程中,质量检测可以在多个环节进行,以便及时发现并解决问题。不同的行业采用的质量控制技术可能有所不同。 在商业尤其是制造业中,保证产品质量至关重要。一个产品需要经过多次…

【科技前沿】电子设计新贵SmartEDA:为何它引领行业风潮?

在当今这个电子科技日新月异的时代&#xff0c;电子设计工具如同设计师的魔法棒&#xff0c;不断推动着产品创新的速度。而近期&#xff0c;一款名为SmartEDA的电子国产设计仿真软件异军突起&#xff0c;成为了行业内的新宠。那么&#xff0c;SmartEDA究竟有何过人之处&#xf…

Adaptive Server Connection Failed on Windows

最近在使用pymssql &#xff08;版本2.3.0&#xff09;连接SQL Server2012遇到如下问题&#xff1a; pymssql._mssql.MSSQLDatabaseException: (20002, bDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (localhost)\nDB-Lib error message 2000…

LeetCode:503. 下一个更大元素 II(Java 单调栈)

目录 503. 下一个更大元素 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 单调栈 原理思路&#xff1a; 503. 下一个更大元素 II 题目描述&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&…

分布式锁实现方案-基于Redis实现的分布式锁

目录 一、基于Lua看门狗实现 1.1 缓存实体 1.2 延迟队列存储实体 1.3 分布式锁RedisDistributedLockWithDog 1.4 看门狗线程续期 1.5 测试类 1.6 测试结果 1.7 总结 二、RedLock分布式锁 2.1 Redlock分布式锁简介 2.2 RedLock测试例子 2.3 RedLock 加锁核心源码分析…

2009年-2022年 地级市-环境污染处罚数据

环境污染处罚数据是环境保护领域中重要的信息资源&#xff0c;它记录了因违反环保法律法规而受到行政处罚或法律制裁的具体情况。这些数据对于提高公众的环保意识、促进企业采取环保措施以及推动环境治理具有重要作用。 数据内容概述 违法行为的主体&#xff1a;即受到处罚的…

私域引流的艺术:高效策略解锁流量密码

在数字化营销的浪潮中&#xff0c;私域流量以其高黏性和低成本的优势成为品牌和企业竞相追逐的宝藏。然而&#xff0c;如何有效引流至私域&#xff0c;却成了摆在每个运营者面前的难题。今天&#xff0c;我们将一起探索那些值得采用的私域引流方法&#xff0c;帮助你解锁流量的…