刨析函数中的实参与形参

 实际参数

 实际参数通常简称为实参,是真正传到函数的的参数,实参可以是常量、变量、表达式、函数等,无论传的形式如何,都必须为一个确定的值。

 形式参数

 形式参数通常简称为形参,形参是指函数名中的变量,只有在函数调用时才为形式参数分配内存单元,函数调用完后又会自动销毁。

实参与形参的传址调用 

说到函数,我们自然而然就想到了实际参数与形式参数(后面简称为实参与形参),大多数情况下,我们都需要多个函数来分工合作,而且它们又相互独立,函数在编程当中是不可替代的存在,可以代码块的绝大部分都是函数,最突出的就是main主函数。

既然我们需要每一个函数来帮助我们分担不同的工作,这时我们就要传递实参给函数,这时实参在函数中就变为了形参。使用函数时,如果在函数中形参与实参不同时,函数专门向内存申请了一块空间用于存放形参,经过函数的处理,再返回需要的值给main主函数。可见实参与形参在一个函数中有密切的联系。例子如下:

题目:利用函数来交换两个数(实际下面的代码无法达到我们的预期,只是用来举例)

int Swap(int x, int y)
{
	int z = 0;
	z = x;
	x = y;
	y = z;
}
int main()
{
	int a = 10;
	int b = 20;
	Swap(a, b);
	printf("%d %d", a, b);
	return 0;
}

经过调试可见,即使在主函数在调用Swap函数传过去的是a和b,但Swap重新向内存申请地址来接受a和b,我们再运行代码后得到的结果是

上面的代码看似逻辑没什么错误,但我们并没有将a和b的数进行交换,主要原因:实参a和b,传给形参x和y的时候,形参将是实参的一份临时拷贝。改变形参x和y,是不会影响a和b的。

要Swap函数真正地能交换a和b的值,代码如下: 

Swap(int* x, int* y)    
{
	int z = 0;
	z = *x;
	*x = *y;
	*y = z;
}
int main()
{
	int a = 10;
	int b = 20;
	Swap(&a,&b);
	printf("a=%d b=%d", a, b);
	return 0;
}

运行的结果如图:

经过结果我们可见Swap成功交换了主函数中a和b的值,能够实现交换的主要原因是我们在传递实参到函数内部时,注意实参传递的是a和b的地址,因此Swap要用两个指针来接收。能在函数内部改变函数外的值,在C语言称为传址调用。

如下图所示,a的地址对应*x的地址相同,b的地址对应*y的地址相同,改变*x和*y实际上就是改变a和b的值。

实参与形参的传值调用

在上面经过”利用函数交换两个数“的题目和调试发现实参与形参之间确实存在必要的联系,但并非我们都必须传变量的地址过去,思考一下,什么情况下没必要传地址呢?

其实我们需要自定义函数在不改变实参时就不需要传地址,在C语言称为传值调用。例如打印1000到2000年之间的闰年:

#include <stdio.h>
int is_leap_year(int n)
{
	if (n % 400 == 0 || (n % 4 == 0 && n % 100 != 0))
	{
		return 1;
	}
	else
	{
        return 0;
	}
	return ((n % 4 == 0) && (n % 100 != 0) || (n % 400==0));
}
int main()
{
	int i = 0;
	for (i = 1000; i <= 2000; i++)
	{
		if (is_leap_year(i) == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

看到这里我相信读者对实参、形参、传址调用、传值调用都已经有一定的了解。如果对文章内容还满意,留个赞再走!

如果对博主有好的建议和对本篇博客没有写好的部分给予批评,本人不胜感激!下篇博客见!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zjruiiiiii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值