当前位置:网站首页>C语言函数详解(2)【函数参数——实际参数(实参)&形式参数(形参)】
C语言函数详解(2)【函数参数——实际参数(实参)&形式参数(形参)】
2022-08-02 22:05:00 【yin_尹】
这篇文章我们一起学习一下函数的参数,函数的参数分为实参和形参。
一.什么是实际参数(实参)
首先我们来学习实参,什么是实参呢?
实际参数简称“实参”。
在调用有参函数时,函数名后面括号中的参数称为“实参”,是我们真实传给函数的参数,实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
下面我们写个代码来帮助大家理解:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 20;
int b = 30;
int ret1 = add(20, 30);
printf("%d\n", ret1);
int ret2 = add(a, b);
printf("%d\n", ret2);
int ret3 = add(a + b, a - b);
printf("%d\n", ret3);
int ret4 = add(add(2, 3), 5);
printf("%d\n", ret4);
return 0;
}
无论实参是何种类型的量,它们都必须有确定的值
二.什么是形式参数(形参)
那什么是形式参数呢?
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。
形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
还来看上面的代码:
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 20;
int b = 30;
//printf("%d %d", x, y);
int ret1 = add(20, 30);
printf("%d\n", ret1);
int ret2 = add(a, b);
printf("%d\n", ret2);
int ret3 = add(a + b, a - b);
printf("%d\n", ret3);
int ret4 = add(add(2, 3), 5);
printf("%d\n", ret4);
return 0;
}
1.形参只在函数中有效:
我们如果在函数外部使用函数形参,这是不可行的。
2.形参在函数调用过程中才实例化(分配内存单元)
函数调用之前,形参还未创建
函数调用过程中,形参才被实例化
函数调用结束,形参生命周期结束,被销毁
三.形参与实参的关系
了解了什么是函数的形参和实参,那两者之间有什么关系呢?
他们的关系是:
形参实例化之后其实相当于实参的一份临时拷贝。
#include <stdio.h>
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 20;
int b = 30;
int ret1 = add(a, b);
printf("%d\n", ret1);
return 0;
}
这里我们对函数的实参和形参进行分析:
1. 我们先来尝试写一个函数交换两个整形变量的内容
#include <stdio.h>
//实现成函数,但是不能完成任务
void Swap1(int x, int y) {
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);
printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
return 0;
}
函数swap1用x,y接收了num1,num2,并把x,y进行了交换,但是我们打印出来的num1,num2并没有交换,为啥呢?
这是因为在函数调用时,形参x,y是实参num1,num2的一份临时拷贝,形参和实参并没有建立真正意义上的联系,形参x,y是两个独立的变量,和实参num1,num2分别占用不同的内存空间,在这里,形参和实参只是数值相同罢了.
所以,交换形参x,y,并不会对实参num1,num2产生影响!!!
在这里,我们如果想要达到交换实参的目的,需要进行传址调用,这个后面我们会详细给大家讲解,现在可以先简单了解一下:
所谓传址,就是num1,num2的地址作为参数传过去,当然我们就需要两个整形指针去接收,然后,我们在函数内部,就可以通过这两个指针找到num1,num2,对它们进行交换.
接下来,我们就用传址调用的方法来实现一下函数:
#include <stdio.h>
//正确的版本
void Swap2(int* px, int* py) {
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
return 0;
}
这次,我们就真正达到了交换num1,num2的目的
总之,我们最后得到的结论就是,函数实参与形参的关系就是:
形参实例化之后其实相当于实参的一份临时拷贝。
以上就是对函数参数的介绍,欢迎大家指正!!!
边栏推荐
- MySQL删除数据后,释放磁盘空间
- Broadcast platform, the use of the node generated captcha image, and validate
- ROS2初级知识(9):bag记录过程数据和重放
- wallys/new product/WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975
- 软件测试到底自学还是报班?
- SRv6网络演进面临的挑战
- H5网页播放器EasyPlayer.js播放器界面的加载效果无法消失是什么原因?
- 我用这一招让团队的开发效率提升了 100%!
- 别再用Field注入了
- mysql 错误:The driver has not received any packets from the server.
猜你喜欢
“百日行动”进行时:700余交通安全隐患被揪出
测试人生 | 阿里实习 90 天:从实习生的视角谈谈个人成长
Software testing pen questions 1 (with answers)
B站回应“HR 称核心用户都是 Loser”:该面试官去年底已被劝退,会吸取教训加强管理
YAML文件格式
GameStop NFT 市场分析
Finally understand: With threads, why do we need coroutines?
牛客每日刷题之链表
学习基因富集工具DAVID(2)
If the watermark according to how to realize the function
随机推荐
Command line startup FAQs and solutions
openssl源码下载
CKA、CKAD、CKS、KCNA、CFCD考试
vscode 自定义快捷键——设置eslint
qt静态编译出现Project ERROR: Library ‘odbc‘ is not defined
RuoYi-App Startup Tutorial
【TypeScript】深入学习TypeScript类(下)
ML之PDP:基于titanic泰坦尼克是否获救二分类预测数据集利用PDP部分依赖图对RF随机森林和LightGBM模型实现可解释性案例
搭建Spark开发环境(第二弹)
测试人生 | 阿里实习 90 天:从实习生的视角谈谈个人成长
创建型模式 - 单例模式Singleton
How does Redis easily achieve system instant kill?
学习基因富集工具DAVID(3)
【使用pyside2遇到的问题】This application failed to start because no Qt platform plugin could be initialized.
在迁移测试中,源表、中间表、目标表的迁移规则
最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解
threejs 动态调整相机位置,使相机正好能看到对象
双轴晶体中锥形折射的建模与应用
【C语言】带头双向循环链表(list)详解(定义、增、删、查、改)
搭建直播平台,使用node生成验证码图片,并进行验证