首先介绍一下函数中传值与传址的概念:

  1. 传值:传值,实际是把实参的值赋值给行参,相当于copy。那么对行参的修改,不会影响实参的值 。
  2. 传址: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。

下来用两个例子来说明:

先看看这个代码

#include<stdio.h>void swap(int n1,int n2)
{int temp;temp=n1;n1=n2;n2=temp;
}int main()
{int a=10;int b=20;printf("a=%d\n",a);printf("b=%d\n",b);swap(a,b);printf("a=%d\n",a);printf("b=%d\n",b);
}

以上代码实现的功能好像是交换两个数的数值对吧!运行一下看看结果:

不对啊,和我们预想的不一样啊,可以看到a,b的值并没有被交换,怎么回事呢?
因为a和b虽然成功把值传给了n1、n2,n1、n2也完成了它们之间数值的交换,但是也仅仅是n1、n2之间交换了,和a、b没有关系。这是一次单向的传递过程,a、b能传给n1、n2,n1、n2能成功互换其数值,但n1、n2是定义在函数swap中的局部变量,当函数调用结束后,它俩就over了,被残忍抛弃了(子函数的生命期为子函数开始调用到结束调用,调用结束后就主动释放了),因此它们没有渠道把交换的值传回给a、b。所以看到的是如上图的结果。

有了以上的结果,我们再来看这样一段代码:

#include<stdio.h>void swap(int *p1,int *p2)
{int temp;temp=*p1;*p1=*p2;*p2=temp;
}int main()
{int a=10;int b=20;printf("交换前a,b的值分别为:\n");printf("a=%d\n",a);printf("b=%d\n",b);swap(&a,&b);printf("交换后a,b的值分别为:\n");printf("a=%d\n",a);printf("b=%d\n",b);
}

以上代码的功能同样是实现交换两个数的数值对吧!让我们再来看看运行结果:

很奇怪,为什么这儿却能交换了?调试一下看看有什么玄机:



这是调用swap函数前a、b的数值与其在内存中开辟的空间的地址以及调用函数后时*p1、*p2的数值与其地址。


这是调用swap函数后a、b的数值与其在内存中开辟的空间的地址以及开始调用函数时*p1、*p2的数值与其地址。
可以看到此时a、b与*p、*p2的地址空间是一样的,那么当*p1、*p2被修改时,a、b也会跟着发生变化,因为此时二者占用了同一块空间,当任意一者使空间里的内容发生变化时,二者都会做相同变化。
举个不太恰当的例子,把夫妻二人各看做一个变量,把它们的共用的银行卡看做它们占用的同一块空间,此时,他俩拥有的财产是一样的,都是银行卡里的钱,那么,不管谁花了或存了钱,他两的财产都会发生同等改变,任意一人对财产的修改会影响到另一个人的财产。(当然,私房钱不算)。仔细想想,其实大概就是这么个道理。

函数调用的传值与传址大概就是这么个过程,这快内容其实不难理解,只要知道其概念,通过实验验证,很容易掌握。

C语言中函数调用中的传值与传址相关推荐

  1. Java中等于号,传值和传址区别

    1.Java等号的两种作用 java的等于号在进行数据之间赋值时就是传值:在引用对象之间,等于号作用就是传地址. 比如自建类 ListNode xList=ListNode(0); ListNode ...

  2. 三种函数调用方式:传值、传址、传参考

    1.传值调用: 形参是正常类型,实参是正常类型,不会改变实参的值. void swap_value(int x,int y) //定义 swap_value(x,y);//调用 2.传址调用: 形参是 ...

  3. 传值类型_java中的“传值”与“传址”问题

    "用对象来生成对象""对象作为参数进行传递""构造方法中的参数为对象"问题 本质上是"传值"与"传址" ...

  4. url 参数传递的两种方式_VB编程中的传值与传址两种参数传递方式,你清楚吗?...

    Tips:欢迎公众号设置为星标,VB技术干货文章可以第一时间看到.如您在学习VB过程中有独特的见解或者想法,欢迎投稿,可在公众号文章下直接留言. 推荐阅读 1. VB编程语言基础知识点总结 2. VB ...

  5. 【濡白的C语言】初学者-从零开始-5(模块化设计——函数,传值和传址)

    前言 C语言编程又称模块化设计,讲的就是对于一个程序而言,每一个功能都要类似于独立的实现,就像一个个板块,需要的时候拿出来即可.模块化的设计思想是一个程序员必不可缺少的思想. 如果有不明白的地方,或者 ...

  6. javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象...

    对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...

  7. Python 传值和传址 copy/deepcopy

    传值:被调函数局部变量改变不会影响主调函数局部变量 传址:被调函数局部变量改变会影响主调函数局部变量 Python参数传递方式:传递对象引用(传值和传址的混合方式),如果是数字,字符串,元组则传值:如 ...

  8. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解

    在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...

  9. php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程

    在php中我们函数传值就比较简单了,但可能有些朋友地天真无邪函数传址或引用搞不明白,下面小编来给各位介绍在php中函数传值与传址(引用)介绍,希望对各位有所帮助. php中引用的用法: 1. 变量的引 ...

最新文章

  1. PHP Web System Optimization(undone)
  2. java定时任务,每天定时执行任务
  3. RPM安装命令总结--转载
  4. C++ 面试知识总结
  5. java中引导页面的,设计模式之模板模式引导篇
  6. 浏览器实验中的故障排除
  7. 判断数组中某个元素除自身外是否和其他数据不同_18 张图带你彻底认识这些数据结构...
  8. 1007.protobuf序列化string数据遇'\0'截断问题
  9. vue中定义多重样式
  10. 机房收费系统合作版(二):透过显示上机人数品味如何做到全心全意为人民服务
  11. head first设计模式之设计原则
  12. Android中向ContactsProvider中插入大量联系人
  13. 吴恩达深度学习课程第二章第三周编程作业(pytorch实现)
  14. php微信消息通知,php实现微信小程序消息通知
  15. fastlane php,Fastlane自动化打包笔记
  16. 皮皮虾视频分析并加工
  17. 二维码和app扫码下载
  18. 从黑格尔的正反合理论看人生的三个阶段
  19. Codeforces Round #571 (Div. 2)
  20. 高并发测试工具webbench

热门文章

  1. 知己知彼,百战百胜!如何做好干系人管理
  2. 刚刚,阿里开源 iOS 协程开发框架 coobjc!
  3. 五年,时间告诉我只有自己强大才是真的强大!
  4. 阿里AI界的新伙伴,1秒钟自动生成20000条文案
  5. 双十一丝般顺滑体验背后:阿里云洛神网络虚拟化系统揭秘
  6. Kubernetes 稳定性保障手册(极简版)
  7. 从浪漫走向坚韧:开源数据库的演变
  8. 今天下午三点,2020深圳开放数据应用创新大赛将举行第二场线上推介会
  9. 大数据实践的6个阶段
  10. 震惊!微软小冰公众号被封?示好国内,苹果拟推出特色版iPhone;谷歌更新Google Play支持名单:华为荣耀多款在列……...