C语言的参数传递原理解析(值传递)

本讲我们和大家一起来聊一聊C语言中有关参数传递的一些知识。

1.问题引入

请写出以下程序的打印结果。

#include

// 将某整数加10

void add_by_10(int a){

a = a + 10;

}

int main(int argc, char *argv[]){

int a = 2;

add_by_10(a);

printf("a= %d\n", a);

上面的程序非常的简单,我们定义了一个函数add_by_10,它的功能是实现整数加10,然后在main函数中调用,由于a初始值为2,当调用函数了以后,a的值变成了12。

事实真是如此吗?如果你编译执行了这段程序,你会发现打印的结果是:"a = 2".

为什么会这样呢?这和你想的完全不一样。

2.问题分析

接下来我们就和大家一起来分析为什么会是这样的结果。

之前的文章我们讲过,所谓变量的定义其实就是从4G的内存条上去拿空间,如你定义了一个int a;其本质含义就是要从你新买的4G内存条上拿走一块4字节大小的空间,如下所示,黄色部分的空间就是属于a的,其他人不能用哈。

我们再将该问题深入一些,其实系统在分配内存时,是以函数为基本单元,如问题1中定义的程序,我们有两个函数main和add_by_10,所以系统会先分别给这两个函数分配内存,然后这两个函数内部的变量都会在各自函数所属的内存空间去拿内存。

在4G的内存条上有一部分区域是属于main函数的(黄色区域),还有一部分区域是属于add_by_10函数的(橙色区域),如下所示:

main函数中定义了一个int a;所以这个a会从main区域拿走4字节的空间(黑色区域),并赋值为2。另外add_by_10函数中有一个参数int a所以这个a也会从add_by_10区域拿走4字节空间(灰色区域),如下所示:

当在main函数中执行add_by_10(a)这行代码时,会将main函数a的值,赋给add_by_10函数的形参a,如下:

add_by_10函数中,对其所属的a变量执行了加10操作后,a变成了12,如下:

add_by_10函数调用结束后,将会释放add_by_10的内存空间。

从上面的一步一步分析,大家可以看到,其实main函数中的a一直都是2,并没有发生任何的改变,而改变的只是add_by_10函数中的a值。所以这就是为什么你最终看到的结果是:"a= 2"而不是"a= 12"。

请思考:怎样才能达到"a = 12"这个结果?

 

转载于:https://www.cnblogs.com/wentujun/p/7707130.html

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

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

相关文章

字符串php手册,php知识点复习之字符串

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 /*echo mark qqqqqq\nqqqqqqbrqqqqqqqqqqqqq\rqqqqqqqqqqqqqqqqqq mark*/ //技术标志要另起一行,并且是顶格写! //作用跟""类似//最致命的一点是:mark后面…

一个诡异的循环:意识何以意识到意识自身?

© Lia Koltyrina / Shutterstock本文经公众号利维坦(ID:liweitan2014)授权转载存在的感觉可能只是一种感觉。——本凯利夫(Ben L. Callif)与其他事物相同,我似乎身处宇宙漩涡的中心,整个宇…

洛谷 P2251 质量检测

题目背景 无 题目描述 为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] min{A1, A2, ... Am},以及第2至第M 1件的Q[m 1], Q[m 2] ... 最后统计第N - M …

美军重视扩展现实技术的研究和应用

来源: 知远战略与防务研究所 编译:王绍祺美国陆军退役中将苏珊劳伦斯曾担任陆军G-6首席信息官、网络企业技术司令部司令,现为埃森哲联邦服务公司武装部队部门总经理。苏珊劳伦斯在美国《信号》杂志2019年10月号发表文章,指出扩展…

【Codeforces Round #442 (Div. 2) A】Alex and broken contest

【链接】 我是链接,点我呀:) 【题意】 在这里输入题意 【题解】 注意是所有的名字里面,只出现了其中某一个名字一次。 【代码】 #include <bits/stdc.h> using namespace std;const string temp[] {"Danil","Olya","Slava","Ann&q…

oracle 从pflie启动,oracle初始化参数文件管理

oracle实例是指运行状态下的oracle软件&#xff0c;是由内存结构跟一些进程结构组成的&#xff0c;主要实现数据库的访问跟控制功能&#xff0c;是oracle的核心。初始化参数文件是oracle实例运行所需要的参数配置文件&#xff0c;oracle实例启动是必须先从参数文件中读取数据。…

寒武纪开盘暴涨350%,市值突破1000亿,85后创始人身家超300亿!千亿盛宴背后隐忧不可忽视!...

来源&#xff1a;EETOP7月20日&#xff0c;寒武纪科创板首发上市&#xff0c;发行价每股64.39元&#xff0c;开盘价为250元/股&#xff0c;涨幅288%。最高价更是达到了295元/股&#xff0c;涨幅358%&#xff01;市值一度突破1000亿人民币&#xff0c;不过随后股民信心有所不足&…

Mac上的抓包工具Charles

今天就来看一下Mac上如何进行抓包&#xff0c;之前有一篇文章介绍了使用Fidder进行抓包 http://blog.csdn.net/jiangwei0910410003/article/details/19806999 不过可惜的是&#xff0c;Fidder使用C#开发的&#xff0c;所以就不能在Mac上使用了&#xff0c;不过还有另外一个抓包…

oracle 在所有表中查某个值,oracle需要查询某个字段的值在其他某个表中有没的值有相同...

使用场景&#xff1a;知道某个字段的值(例如&#xff1a;“张三”)&#xff0c;需要查询在其他某个表中有没有相同的值&#xff0c;常用于搜索关联表等。对于oracle数据库&#xff1a;Pl\sql没有搜索功能&#xff0c;需借助存储过程&#xff0c;完成搜索&#xff0c;搜索结果是…

嵌入式系统之操作系统篇

1 、嵌入式软件基础  &#xff08;1&#xff09;嵌入式软件的特点&#xff1a;    A、规模较小。    B、开发难度大。    C、实时性和可靠性要求高。    D、要求固化存储。  &#xff08;2&#xff09;嵌入式软件分类&#xff1a;    A、 系统软件&…

oracle11g session,Oracle11g中Killsession心得

我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为:alter system kill session sid,serial# ;被kill掉的session,状态会被标记为killed,Oracle会在…

26个顶尖战略咨询公司常用分析模型详解!

导 读 ( 文/ CMKT咨询圈 整理 )咨询行业是不少小伙伴的奋斗目标&#xff0c;麦肯锡、波士顿、贝恩等顶尖战略咨询更是所有行业顶尖的存在&#xff0c;咨询顾问是如何解决问题&#xff0c;为企业做战略规划&#xff0c;咨询公司常用分析模型功不可没。几乎每个大型快消企业的高管…

oracle13001,安装oracle11g 遇到INS-13001环境不知足最低要求 解决方法

华大竟出了一个炒股女高手&#xff0c;年仅27岁&#xff01;逸婕贸易 燨燚html原安装oracle11g 遇到INS-13001环境不知足最低要求 解决方法2017年08月18日 09:45:23 zouxfbj 阅读数&#xff1a;3207在安装时点击setup.exe以后&#xff0c;出现了:[INS-13001]环境不知足最低要。…

中国工程院王辰院士对话百度CTO王海峰,大数据与医学的一场史诗级邂逅

来源&#xff1a;脑极体你有多久没有关注疫情的消息了&#xff1f;除了戴口罩变得格外闷热&#xff0c;以及偶尔从海外传来的新闻之外&#xff0c;我已经很少会主动点开《新型冠状病毒肺炎疫情地图》了&#xff0c;而几个月之前&#xff0c;我简直恨不得“住”在疫情新闻板块里…

LoadRunner11支持的浏览器小结-Loadrunner11打不开IE浏览器的问题

http://www.cnblogs.com/qmfsun/p/4807237.html转载于:https://www.cnblogs.com/Mr-zst/p/7724799.html

rm linux 复制目录,linux学习(四)复制(cp)移动(mv)删除(rm)查找(find)文件、文件夹操作、软硬链接的区别...

复制文件cp命令用于复制文件到制定的目录 语法格式为&#xff1a;cp [选项] 源文件或目录 目标文件或目录命令选项含义cp -d当复制符号链接时&#xff0c;把目标文件或目录页建立为符号链接&#xff0c;并指向与源文件或目录连接的原视文件或者目录cp -f强行复制文件或者目录cp…

程序猿的日常——JVM内存模型与垃圾回收

Java开发有个很基础的问题&#xff0c;虽然我们平时接触的不多&#xff0c;但是了解它却成为Java开发的必备基础——这就是JVM。在C中我们需要手动申请内存然后释放内存&#xff0c;否则就会出现对象已经不再使用内存却仍被占用的情况。在Java中JVM内置了垃圾回收的机制&#x…

智慧城市丨智能时代的城市设计新策略

来源&#xff1a;万物智能视界智慧城市作为解决城市病、提高城市发展质量以及改善城市群建设结构的新型城市形态&#xff0c;已成为世界各地城市发展的必然趋势。借助新兴的信息技术能够随时随地感知、捕获、传递和处理信息&#xff0c;能够实现对城市的精细化、智能化管理&…

从看见到听见,机器人传感能否解决智能制造检测的最后一公里难题?

来源&#xff1a;机器人大讲堂导读手机、无人机、机器人眼睛里的隐藏王者&#xff0c;华为、小米的视觉供应商&#xff0c;这家隐形冠军现在也开始在机器人行业发力&#xff0c;将延伸人类感官?华为、VIVO、小米、魅族&#xff0c;这些市场上你能找到的手机品牌&#xff0c;其…

python--17个新手常见Python运行时错误

当初学 Python 时&#xff0c;想要弄懂 Python 的错误信息的含义可能有点复杂。这里列出了常见的的一些让你程序 crash 的运行时错误。 1&#xff09;忘记在 if , elif , else , for , while , class ,def 声明末尾添加 &#xff1a;&#xff08;导致 “SyntaxError &#xff1…