函数参数

函数参数 ,第1张

一、函数参数
 在C语言的语法中:

函数的参数包括两个部分:实参 ( 实际参数 ) 和形参 ( 形式参数 ) 

实参 ( 实际参数 ) :

真实传给函数的参数,叫实参。

讲得通俗易懂一点,就是在主函数中传递给函数的变量是实参。

| 例 |
#include

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

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

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

 

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

 

 

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/726758.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存