700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 函数参数 ( C语言语法 ) -------《关于实参和形参的那些事》

函数参数 ( C语言语法 ) -------《关于实参和形参的那些事》

时间:2019-07-30 20:44:41

相关推荐

函数参数 ( C语言语法 ) -------《关于实参和形参的那些事》

一、函数参数

在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 >> 形参变量的变量名可以和实参变量的变量名一样,并不会冲突。

新人写博客,如有错误望指出,十分感谢!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。