当前位置:网站首页>函数的参数
函数的参数
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()函数调用是传址调用。
总结来说,传值调用的函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
边栏推荐
- Candence学习篇(11) allegro中设置规则,布局,走线,铺铜
- 基于稳态视觉诱发电位和注意力脑电的混合脑机接口系统
- 深度学习基本概念
- ApiPost is really fragrant and powerful, it's time to throw away Postman and Swagger
- Docker installs canal and mysql for simple testing and achieves cache consistency between redis and mysql
- Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记
- Docker搭建Mysql主从复制
- 初识QEMU
- DCM middleware family welcomes a new member
- Redis学习笔记-3.慢查询和其他高级数据结构
猜你喜欢

Docker实践经验:Docker 上部署 mysql8 主从复制

MySQL面试八股文(2022最新整理)

A Week of Wonderful Content Sharing (Issue 14)

生信周刊第38期

After class, watching the documentation and walking back to the lab, I picked up the forgotten SQL operators again

串的基本概念与操作

Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性

音视频基础

基于C51实现按键控制

多线程学习笔记-2.final关键字和不变性
随机推荐
快速学完数据库管理
Redis学习笔记-3.慢查询和其他高级数据结构
AWS Amazon cloud account registration, free application for 12 months Amazon cloud server detailed tutorial
Three-tier architecture service, dao, controller layer
【核心概念】图像分类和目标检测中的正负样本划分以及架构理解
After class, watching the documentation and walking back to the lab, I picked up the forgotten SQL operators again
Qt鼠标穿透
Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution
502 bad gateway causes and solutions
学习笔记 Golang 写入文件(io.WriteString、ioutil.WriteFile、file.Write、write.WriteString)
cesium-Web网页优化进阶
Mysql环境变量的配置(详细图解)
一周精彩内容分享(第14期)
[core]-ARMV7-A, ARMV8-A, ARMV9-A Architecture Introduction "Recommended Collection"
Docker实践经验:Docker 上部署 mysql8 主从复制
MySQL模糊查询性能优化
三相PWM整流器预测直接功率控制
The latest MySql installation teaching, very detailed
[Shader] Shader official example [easy to understand]
栈和队列的基本概念