本讲我们和大家一起来聊一聊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

C语言的参数传递原理解析(值传递)相关推荐

  1. go python java_一文助你搞懂参数传递原理解析(java、go、python、c++)

    前言 最近一年多的时间陆续接触了一些对我来说陌生的语言,主要就是 Python 和 Go,期间为了快速实现需求只是依葫芦画瓢的撸代码:并没有深究一些细节与原理. 就拿参数传递一事来说各个语言的实现细节 ...

  2. java int 传引用吗_Java的参数传递是「值传递」还是「引用传递」?

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...

  3. Python学习:Python中参数传递,是值传递,引用传递or其它

    本博客主要学习python参数传递机制,了解python的参数是如何传递的.学过其它语言如(C,C++),都知道参数传递有值传递和引用传递,python的参数传递属于哪种? 一.值传递和引用传递 值传 ...

  4. java中的参数传递(只有值传递没有引用传递)

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递).所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答. java中的数据类 ...

  5. Java实验方法参数传递与递归_4.3类的结构之二:方法(return,重载,可变个数形参,值传递,递归)...

    类的设计中,两个重要结构之二:方法 * 方法:描述类应该具有的功能. * 比如:Math类:sqrt()\random()\ .. * Scanner类:nextXxx() .. * Arrays类: ...

  6. Java中的参数传递,到底是值传递还是引用传递?

    文章内容为转载,转载自公众号Hollis关于我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 原文链接:我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种! 知乎回答链接:Java 到 ...

  7. 【Java】探究Java方法的参数传递是值传递还是引用传递

    测试思路 每个更改形参的方法,返回值都是void,不同方法的参数设置不同类型. 注意在方法内测地址的时候在改之前测一下,才能看出传入参数是不是传了地址.(注意反正OS的内存地址是虚拟的,JVM中的也是 ...

  8. C语言函数调用的原理

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105088660 C ...

  9. c语言的指针和java引用传递参数,java传参数是传值还是引用

    1.基参数是本数据类型 传递是值(或者说值得副本). 2.参数是对象的话传递的是对象引用的副本.(1.修改引用副本指向新对象不会影响原来对象,2.修改引用指向的对象的属性会修改成功,3.如果传递时st ...

最新文章

  1. python基础 练习题
  2. css 超出文字头尾相接滚动_前端的一些雕虫小技,从100%和滚动条说起
  3. 小程序沉浸式_古北水镇红叶祭嵌入戏精学院 全新文旅沉浸模式让游客嗨起来...
  4. android+proguard目录,Android proguard问题:路径可能不是null或空字符串.路径=“空”...
  5. 计算机组装技术的心得与体会,计算机技术心得体会
  6. 如何在mysql命令窗口获取到程序正在执行的sql语句
  7. ACL2021 | 跨视觉语言模态任务与方法
  8. MySQL讲义第 43 讲——select 查询之查询练习(一)
  9. 网页跳转微信打开指定页面
  10. 浮点数与32位16进制互转(有代码)
  11. WIN_DOS经典大全
  12. 哪一种验证方法最好?形式验证、硬件加速还是动态仿真?
  13. angularjs2学习教程
  14. 常见的无法上网故障原因和解决方法
  15. C语言%lld、%llu无法正常输出比long long长整数小的数
  16. idm下载器如何使用 idm下载器使用技巧
  17. 推荐16个下载超酷脚本的免费热门网站
  18. 分式化简结果要求_分式约分的结果是()
  19. 联想计算机M.2固态银盘,联想天逸510s 08IKL更换M.2 PCIE 固态硬盘后装系统,亲测有效...
  20. S7-200Smart 软件下载地址,仿真下载地址

热门文章

  1. 常用排序算法以及算法性能测试(完整C/C++代码实现)
  2. LeetCode 1910. 删除一个字符串中所有出现的给定子字符串
  3. LeetCode 1706. 球会落何处(模拟)
  4. 剑指Offer - 面试题59 - II. 队列的最大值(deque模拟单调栈)
  5. LeetCode 1103. 分糖果 II
  6. LeetCode 1154. 一年中的第几天
  7. 屏幕Screen类文件编写
  8. pythonb超分辨成像_深度原理与框架-图像超分辨重构-tensorlayer
  9. vim配置python开发环境_GitHub - TTWShell/legolas-vim: Vim配置,为python、go开发者打造的IDE。...
  10. win10版本查看_想知道电脑中安装的win10版本号,用这3招就对了,一键查看