一、函数参数
在C语言的语法中:
函数的参数包括两个部分:实参 ( 实际参数 ) 和形参 ( 形式参数 )
实参 ( 实际参数 ) :
真实传给函数的参数,叫实参。
讲得通俗易懂一点,就是在主函数中传递给函数的变量是实参。
| 例 |
#include<stdio.h> int Add(int x, int y) //变量x和变量y为形参 { return x + y; } int main() { int a = 10; int b = 20; int ret = Add(a, b); //变量a和变量b为实参 printf("a + b = %d\n", ret); return 0; }
实参的类型可以为: 常量,变量,表达式,函数等。
!! 值得注意的是 !!
无论实参是哪一种类型,在我们进行调用函数时,都要确保实参有确定的值,以便把这些值传递给形参。
形参 ( 形式参数 ) :
形参是指在函数名后的括号中的变量,用于接收实参传递的值。
形参只有在函数被调用的过程中才会实例化 ( 分配内存单元 ) ,因此当函数调用完后,出了函数的作用域 ( 指的是 { } 的范围 ) 形参就会自动销毁。
也就是说,形参只有在函数中有效
在上面的代码段的Add函数中的 x 和 y 就属于形参。
二、实参与形参之间的数据传递
实参传递数据给形参有两种方式,一种是传值 ( 传递数值 ) ,另外一种是传址 ( 传递地址 )
传值:
若实参以传值的方式将数据传给形参,那么这时的形参充当的是实参的一份零时拷贝,在所调用的函数内部对形参的一系列操作,并不能影响主函数中的实参。
| 例 |
#include<stdio.h> void Swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main() { int a = 10; int b = 20; printf("交换前>>a = %d b = %d\n", a, b); Swap(a, b); printf("交换后>>a = %d b = %d\n", a, b); return 0; }
由代码运行图可以看出,交换前后变量a和变量b的值并没有发生改变。
而我们所期望的是,执行完Swap函数后交换变量a和变量b的值。很明显,用传值这一方法,将实参传给形参,并没有达到我们预期的结果。
为什么会这样呢?
在上图中可以看出实参 a 和 b 的的确确是把自身的数据以数值的方式传递过去给了形参 x 和 y。
x = a = 10,y = b = 20 执行完函数内部后 >> x = 20,y = 10
如果我们仔细观察会现:
&a = 0x0000004ddfbcf7a4 &b = 0x0000004ddfbcf7c4
&x = 0x0000004ddfbcf780 &y = 0x0000004ddfbcf788
实参 a 和形参 x 的地址不同,实参 b 和形参 y 的地址也不同。
也就是本篇博客前提到的,在实参和形参之间是以传值的形式传递数据时,形参只是实参的一份零时拷贝,对形参的修改不能改变实参。
那么解决的办法就是接下来要介绍的传址。
传址:
传址,顾名思义就是,将实参以地址的方式传递给形参。
| 例 |
#include<stdio.h> void Swap(int* px, int* py) { int tmp = *px; *px = *py; *py = tmp; } int main() { int a = 10; int b = 20; printf("交换前>>a = %d b = %d\n", a, b); Swap(&a, &b); printf("交换后>>a = %d b = %d\n", a, b); return 0; }
由代码运行图可以看出,实参以传递地址的形式将数据传给形参,形参用指针变量来接收实参的地址,在Swap函数内,对指针变量实现解引用操作,通过指针变量中存放的地址找到其指向的内容,从而达到修改主函数中实参数据的目的。
如果我们仔细观察会现:
&x = &a = 0x000000be5b6ffcf4
&y = &b = 0x000000be5b6ffd14
实参 a 和 b 分别将自己的地址传给形参 x 和 y,形参 x 和 y 通过地址找到他们分别的指向对象,也就是 a 和 b,借助临时变量 tmp 交换了 a 和 b 的数据。
三、传值 OR 传址
介绍了实参与形参的两种传递数据的方式,那么我们怎么判断什么时候传值,什么时候传址呢?
>> 如果调用函数的目的是改变主函数中实参变量时,则需要传值。
>> 如果不想改变主函数中实参变量时,则传值即可。
tips >> 形参变量的变量名可以和实参变量的变量名一样,并不会冲突。
新人写博客,如有错误望指出,十分感谢!
今天的文章
c语言函数实参与形参的联系_c语言形参和实参类型不一致分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80918.html