C语言交换函数:传值函数与传址函数的区别
1.传址函数典例
想必初识C语言函数的同学会遇到这样的问题:
当你想要写一个交换函数:交换输入的两个数字的值。明明将要传的两个数字传上去了,函数里的交换写法也没有问题,可为什么运行时会错呢?这就牵扯到了传值函数和传址函数的区别了。
上述交换函数就是典型的传址函数的例子,我们来具体看看问题在哪里:
通过调试我们可以发现,我们输入的a和b的值(3和5)的的确确传到了x和y这两个形参里,x和y的值也的确发生了交换,可是通过查看地址我们发现,x和y的地址与a和b的地址并不相同,我们可以画图理解:
不难发现,我们的交换只对形参起了作用,x和y的值确实发生了交换,x变为了5,y变为了3,可是这样的变化只在x和y的内存块中发生,a和b在另外的地址中存储,不会受到形参变化的影响。因此我们可以作出改变,不是将a和b的值传上去,而是将地址传过去。
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前: a=%d b=%d\n", a, b);Swap(&a, &b);printf("交换后: a=%d b=%d\n", a, b);return 0;
}
- 我们将a和b的地址传给x和y这两个int*型的指针变量,由于 *x=a , *y=b,解引用就可以调出a,b的值,我们就可以依然利用tmp变量来进行a和b的交换,并且这样的交换还是在a和b原来的地址中进行的,因此会对a和b进行真正的交换。
- 我们可以在调试中验证:
- 可以发现这一次x和a的地址相同,y和b的地址相同,*x 和 *y也成功发生了交换,说明a和b的值交换成功,运行成功结果如下:
2.传值函数
- 顾名思义,传值函数是将输入的值传给形参:
int get_max(int x,int y)
{if (x > y)return x;elsereturn y;
}
int main()
{int a = 0, b = 0;scanf("%d %d", &a, &b);int ret = get_max(a, b);printf("%d\n", ret);return 0;
}
- 上述是一个取两数最大值的函数,这样的函数只用对传入的值(以上述代码为例,只用对两个数字比大小,与这两个数字存放的地址无关)进行操作,不用对实参进行任何的改变,因此只用传值即可。
3.总结
- 传值函数调用的时候,实参传递给形参,这是形参只是实参的一个临时拷贝,形参的改变并不能影响实参。
- 传址函数调用时,由于传递的是实参的地址,形参指针变量存放的是实参的地址,因此对形参解引用后的操作可以影响实参。
C语言交换函数:传值函数与传址函数的区别相关推荐
- 简单了解函数的传值调用与传址调用(C语言)
一.首先需要引入函数中的实际参数与形式参数 实际参数(实参)是指真实传给函数的参数.实参可以是常量.变量.表达式.函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值 ...
- 前端:JS/22/函数(函数的概念,函数的定义格式,函数定义格式的说明,函数的调用,函数的参数),全局变量和局部变量,拷贝传值和引用传址,匿名函数,二维数组,对象,自定义对象的创建
函数 1,函数的概念 函数,是将一段公共的代码进行封装,给它起个名字叫"函数" 函数可以一次定义,多次调用:函数可以将常用的功能代码,进行封装,如:用户名的验证,验证码函数,邮箱验 ...
- JavaScript 函数参数是传值(byVal)还是传址(byRef)?
对于"JavaScript 函数参数是传值(byVal)还是传址(byRef)"这个问题,普遍存在一个误区:number,string等"简单类型"是传值,Nu ...
- 手写C语言之函数概念-函数分类-实参与形参-传值调用与传址调用介绍(11)
目录 函数是什么? C语言中函数的分类 库函数 自定义函数 写一个函数可以找出两个整数中的最大值. 交换整型变量的函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 ...
- 【 C 】函数参数通过传值调用还是传址调用?
C 函数的所有参数均以 "传值调用" 方式进行传递,这意味着函数将获得参数值的一份拷贝.这样函数就可以放心修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数. 既然调用函数 ...
- 函数学习笔记(一) 传值调用、传址调用.
前言 函数是程序的一个子程序,自己定义的函数与主函数的地位·相同. 函数分为: 库函数.自定义函数 一.库函数 在学习函数之前我们就有接触到了函数--库函数 比如说printf.scanf.getc ...
- c语言传址函数,关于c语言函数传址的规定
# include void swap(int *x, int *y); void main025() { int i, j; i = 12; j = 36; printf("i and j ...
- 函数的调用(传值调用和传址调用)
传值调用 函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参. 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式. 这种传参方式可以让函数和函数外边的变量建 ...
- M文件-函数的参数-传值还是传址/检查输入参数的个数/传递参数/输出参数
1 传值的方式 传址的方式区别 function f=ad(a,b) f=a+b: b=b+10; 命令行: a=2;b=5; f=ad(a,b) f= 7 b 5 并没有改变b的值原来 ...
最新文章
- 奥特linux系统监控,奥特曼知识大挑战答案
- java-2018-01-17计划
- python 预编译加速_让Python代码运行更快的最佳方式
- 看动画学算法之:排序-归并排序
- javascript option 菜单图标_苹果电脑上神奇的Option键 巧用option键提升效率
- 设置axios默认访问前缀
- linux 删除桌面环境变量,linux下export命令添加、删除环境变量(转载)
- (Object detection)目标检测从入门到精通——第四部分anchor box
- SQL中DB2数据库修改某字段长度或类型
- java正则表达式提取需要的字符并放入数组
- ubuntu下配置SSD网络全过程
- WinForm程序设计-ToolTip控件
- 全国计算机等级考试系统运行异常,全国计算机等级考试系统安装问题集锦
- Mac 从零搭建Android开发环境记录以及提高效率软件推荐
- Android app 启动优化
- 滴滴夜莺发布v3.3.0版本
- matlab半小提琴图,matplotlib – 分开的小提琴图的一半,以比较尾部数据
- 怎样恢复sd卡数据?靠这几个方法
- ms08_067,ms10_046漏洞复现与利用
- SEO 搜索引擎优化(Google 排名)
热门文章
- 记uniapp离线打包3.1.10(Hbuidlerx版本)前后区别
- “毒舌”专家解析案例Part12—康师傅方便面品牌追踪
- sql中如何计算百分比
- 云场景实践研究第4期:小鱼儿科技
- [附源码]JAVA+ssm基于Java的小型电子病历系统(程序+Lw)
- win10字体大小_Win10 + IDEA 2018.3 + MacType
- 利用百度tts 实现文字转语音(node)
- 关键时刻战略—激活大数据营销 - 电子书下载(高清版PDF格式+EPUB格式)
- 一篇文章读懂儿童机器人编程入门学习的好处
- 自己比较喜欢的几句话,激励自己的IT生涯继续前进