当前位置:网站首页>函数的参数
函数的参数
2022-07-31 12:10:00 【林深方见鹿】
今天我们通过一个函数来简单认识一下函数的形式参数和实际参数,这个函数的功能是实现两个整数的交换。
先来简单介绍一下形参和实参的概念。
形式参数(形参):
形式参数是指函数名后括号里面的变量,形式参数在调用过程中才会被实例化,也就是说才会被分配内存单元,形式参数在函数调用完成之后就会被销毁,因此形式参数只在函数中有效。
实际参数(实参):
实参是指真实传递给函数的参数,实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
我们通过实现两个整数交换的例子来具体认识一下形参和实参。
#include<stdio.h>
void Swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 9, b = 2;
Swap(a, b);
printf("a=%d,b=%d\n", a, b);
return 0;
}运行结果:

Swap()函数的功能是正确的,但是为什么运行结果不正确呢?两个整数通过函数的调用并没有改变值,我们来调试分析一下。

我们知道,变量的存储实际上就是开辟一块内存,变量名实际上就是给这块内存空间起一个名字,所以说,我们改变变量的值,说到底是更改那块内存存储的数据的值,不是由名字决定,是由地址决定。
为了表达方便,我将形参和实参取了不同的名字,友友们感兴趣的话可以自己取相同的名字试一下。
通过上面那张图,不难发现,形参和实参的内存地址并不一样,在程序执行过程中,a,b作为实参,将值传递给形参x,y,所以实际上,在执行完Swap函数后,x,y的值是改变了的,我们打印看一下:
#include<stdio.h>
void Swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
printf("x=%d,y=%d\n", x, y);
}
int main()
{
int a = 9, b = 2;
Swap(a, b);
printf("a=%d,b=%d\n", a, b);
return 0;
}运行结果:

所以说,形参和实参内存空间的地址是不一样的,在调用Swap函数时,x,y拥有自己的空间,同时拥有了和实参一摸一样的内容,所以实参和形参的关系简单来说就是:形参实例化后相当于实参的一份临时拷贝。
我们要实现交换两个整数的功能,但是通过简单的实参传递给形参显然是无法实现的,既然上面我们一直在强调无法实现功能的原因是实参和形参的地址不同,修改形参不会改变实参的值,那我们就通过地址来传值,直接改变存储变量的内存空间的值,来实现我们需要的功能。
#include<stdio.h>
void Swap1(int *px,int *py)
{
int temp = 0;
temp = *px;
*px = *py;
*py = temp;
}
int main()
{
int a = 9, b = 2;
Swap1(&a, &b);
printf("a=%d,b=%d\n", a, b);
return 0;
}运行结果:

看看看!功能实现啦!
我们来调试分析一下地址:
我们看到,上面照片中实参和形参的地址是相同的了。
Swap()函数调用方式是传值调用,Swap1()函数调用是传址调用。
总结来说,传值调用的函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
边栏推荐
- Experience innovation and iteration through the development of lucky draw mini-programs
- Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
- JVS应用中心
- 连续变量离散化教程
- am335x 看门狗驱动&看门狗应用例程序
- In PLC communication error or timeout or download the prompt solution of the model
- 【核心概念】图像分类和目标检测中的正负样本划分以及架构理解
- Cognitive-exercise rehabilitation medical robot application design
- Qt鼠标穿透
- MySql模糊查询大全
猜你喜欢
随机推荐
Json和对象之间转换的封装(Gson)
Life is endless, there are more questions, simple questions to learn knowledge points
chroot命令
kubernetes之服务发现
Addition logic for SAP Commerce Cloud Product Review
全动力学约束的机器人高效时间最优轨迹规划
Acwing第 62 场周赛【未完结】
普林斯顿微积分读本03第二章--编程实现函数图像绘制、三角学回顾
Docker搭建Mysql主从复制
ESP8266-Arduino编程实例-HDC1008温度湿度传感器驱动
纷享销客罗旭对话元气森林黄晓枫:零售数字化的终点不是创新,而是数据
R语言做面板panelvar例子
In Excel using ODBC consumer SAP ABAP CDS view
双非一本进字节了!!纯干货分享
IDEA configure method annotation automatic parameters
0x80070570文件或目录损坏且无法删除(0x80070091怎么删除)
DCM middleware family welcomes a new member
Experience innovation and iteration through the development of lucky draw mini-programs
Comparison of ipv4 and ipv6 (IPV4)
JVS低代码能力简介及功能清单









