(24)想想都可怕还不清楚C语言的形参和实参?简单通过代码和调试演示形参和实参的值变换,就明白了!《小鹅说 C 语言》

@[toc]

1、形参和实参

如之前的文章(21)函数入门 – 保证入门中的3.4.3、形参和实参简单简介章节介绍过的。

如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品;从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值。

这一节我们再来细致讲解一下 C 语言函数的参数。

C 语言函数的参数会出现在两个地方,分别是函数定义处函数调用处,明显这两个地方的参数是有区别的。

再看看我们前面写的代码:

#include <stdio.h>

int Add(int x, int y)
{
    return x + y;
}
int main()
{
    int a = 0;
    int b = 0;

    scanf("%d %d", &a, &b);
    //调用加法函数,完成a和b的相加,求和的结果放在sum中
    int sum = Add(a, b);

    printf("%d\n", sum);
    return 0;
}
1.1、形参(形式参数)

在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数,简称**形参**。

  • 在上面代码中,橙色代码,声明函数的时候,在函数名 Add 后的括号中写的 x 和 y,称为形式参数,简称形参

为什么叫形式参数呢?

实际上,如果只是定义了 Add 函数,而不去调用的话,Add 函数的参数 x 和 y 只是形式上存在的,不会向内存申请空间,不是真实存在的,所以叫形式参数。

形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形参的实例化

1.2、实参(实际参数)

函数被调用时给出的参数包含了实际的数据,会被函数内部的代码使用,所以称为实际参数,简称**实参**。

  • 在上面代码中,绿色代码,调用函数的时候,传递给函数的参数 a 和 b,称为实际参数,简称实参。实参就是真实传递给函数的参数。

形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。

2、区别和联系

  • 形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
  • 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参,所以应该提前用赋值、输入等办法使实参获得确定值。
  • 函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了。

所以,在函数调用过程中,形参的值发生改变并不会影响实参。

虽然我们提到了实参是传递给形参的,他们之间是有联系的,但是形参和实参各自是独立的内存空间

这个现象是可以通过调试来观察的。

请看下面的代码和调试演示:

我们在调试的可以观察到,x 和 y 确实得到了 a 和 b 的值,但是 x 和 y 的地址和 a 和 b 的地址是不⼀样的,所以我们可以理解为形参是实参的⼀份临时拷贝

以上调用 Add() 时是将变量作为函数实参,除此以外,你也可以将常量、表达式、函数返回值作为实参。

如下所示:

total = sum(10, 98);              //将常量作为实参
total = sum(a+10, b-3);           //将表达式作为实参
total = sum(pow(2,2), abs(-100)); //将函数返回值作为实参

也可以是更加复杂的类型,可以是数组,可以是指针,等我们后期学习指针的时候再讲解。

2.1、形参和实参同名

形参和实参可以同名,因为它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。

更改上面的代码,让实参和形参同名:

#include <stdio.h>

int Add(int a, int b)
{
    return a + b;
}
int main()
{
    int a = 0;
    int b = 0;

    scanf("%d %d", &a, &b);
    printf("a=%d, b=%d\n", a, b);
    //调用加法函数,完成a和b的相加,求和的结果放在sum中
    int sum = Add(a, b);
    
    printf("a=%d, b=%d\n", a, b);
    printf("%d\n", sum);
    return 0;
}

运行发现结果是一样的!

在这段代码中,函数定义处的 x 和 y 是形参,函数调用处的 a、b 是实参。通过 scanf() 可以读取用户输入的数据,并赋值给实参 a、b,在调用 Add() 函数时,这份数据会传递给形参 a 和 b

从运行情况看,输入 a 值为 3,即第 13 行实参 a 的值为 3,把这个值传递给函数 Add() 后,形参 a 的初始值也为 3。Add 函数运行结束后,第 17 行输出实参 a 的值仍为 3,可见实参的值不会随形参的变化而变化。


每日一更!

公众号、优快云等博客:小鹅编程笔记

日更较慢有需要完整笔记请私我,C/C++/数据结构-算法/单片机51-STM32-GD32-ESP32/嵌入式/Linux操作系统/uboot/Linux内核-驱动-应用/硬件入门-PCB-layout/Python/后期小程序和机器学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小鹅编程笔记

你的鼓励将是我最大的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值