0


深入理解函数的参数——实际参数(实参)和形式参数(形参)

初步了解函数的参数

函数是我们编写程序必定会用到的,但是我们真的有那么了解它吗?今天就让我们从形参和实参的角度深入学习函数。

接下来让我们上一个简单的代码,是判断是否为闰年的代码,初步了解函数的参数。

#include<stdio.h>
int isLeapYear(int year)//判断年份是否为闰年,是闰年返回1,否则返回0
{
    if ((0 == year % 4 && 0 != year % 100) || 0 == year % 400)
        return 1;
    return 0;
}
int main()
{
    int year = 0;
    printf("请输入年份:");
    scanf("%d", &year);//输入要判断的年份
    if(isLeapYear(year))//输出判定结果
        printf("%d是闰年",year);
    else
        printf("%d是平年", year);
    return 0;
}

程序的逻辑比较简单,就是通过isLeapYear这个函数判断一个年份是不是闰年,是就返回1,不是就返回0。

我们要使用函数,就要先定义函数,我们代码的第二行就是定义了函数:

函数名后括号中的变量就是形式参数。

我们再来看看条件判断语句中调用的函数:

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

实际参数

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

实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形
参。

形式参数

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单元),所以叫形式参数。

形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。

深入学习

接下来我们来直观看看实际参数和形式参数的区别到底是什么。

为了讲清楚,我们使用一段代码:

#include<stdio.h>
void change(int x,int y)
{
    int z=0;
    z = x;
    x = y;
    y = z;
}
int main()
{
    int a = 10;
    int b = 20;
    change(a, b);
    return 0;
}

有了上面的知识,我们可以清楚地知道调用函数change时a,b是实参,x,y是形参,我们来看看这些参数的具体情况。

首先,我们可以看到在程序执行到函数被调用之前,a和b分别被赋值为10和20。

随后,我们进入函数,可以看出x=10,y=20,但是我们可以明显的观察到在下面那一栏中,a,b和x,y的地址是完全不一样的,a和b的地址分别是0x0019f87c和0x0019f870,而x,y的地址分别为0x0019f780和0x0019f784,由此得出函数的实参和形参分别储存在不同的地址中,形参的改变并不会改变实参中的数值。因为形参调用的是相应的地址中的数据,而不能调用实参地址中的数据。

最后等函数调用结束之后x,y的数值交换了,而a,b的数值并没有改变。

最后,当函数调用完成之后局部变量和形参就自动销毁了。因此形式参数只在函数中有效。

这里可以看到change函数在调用的时候 x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。
所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。

知识分享到此结束,喜欢我的小伙伴,可以点赞、评论、加关注,我会努力更新的。


本文转载自: https://blog.csdn.net/JDSZGLLL/article/details/124403905
版权归原作者 JDSZGLLL 所有, 如有侵权,请联系我们删除。

“深入理解函数的参数——实际参数(实参)和形式参数(形参)”的评论:

还没有评论