当前位置:网站首页>函数的参数
函数的参数
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()函数调用是传址调用。
总结来说,传值调用的函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
边栏推荐
- CWE4.8 -- 2022年危害最大的25种软件安全问题
- AWS Amazon cloud account registration, free application for 12 months Amazon cloud server detailed tutorial
- Read through the interface to call the artifact RestTemplate
- WPF中报错:“未将对象引用设置到对象的实例。”
- 【Shader】Shader官方示例[通俗易懂]
- mysql根据多字段分组——group by带两个或多个参数
- kernel syscore
- 关于==和equals的区别和联系,面试这么回答就可以
- Character Functions and String Functions
- JVS应用中心
猜你喜欢

TOGAF10标准读书会第2场活动精彩继续,高光时刻回顾!

学习爬虫之Scrapy框架学习(1)---Scrapy框架初学习及豆瓣top250电影信息获取的实战!

The item 'node.exe' was not recognized as the name of a cmdlet, function, script file, or runnable program.
给你一个大厂面试的机会,你能面试上吗?进来看看!

荣耀手机参数写错,客服认为没错

IDEA configure method annotation automatic parameters

apisix-Getting Started

JVS开发套件产品定位

线性表的基本概念

mysql根据多字段分组——group by带两个或多个参数
随机推荐
立方体IV(暑假每日一题 10)
三六零与公安部三所发布报告:关基设施保护成为网络安全博弈关键
MySQL日志中“binlog”的三种格式玩起来真爽
Build a Valentine's Day confession website (super detailed process, package teaching package)
VBA实现双击单元格自动输出对号再次双击取消对号
快速学完数据库管理
Full GC (Ergonomics)排查分析
TOGAF10标准读书会第2场活动精彩继续,高光时刻回顾!
MySQL模糊查询性能优化
Data Persistence Technology - MP
Qt鼠标穿透
Docker实践经验:Docker 上部署 mysql8 主从复制
基于姿态估计的护具佩戴检测与动作识别
基于C51实现按键控制
A40i/T3 uboot启动时对PMU部分初始化
多线程学习笔记-2.final关键字和不变性
The most complete phpmyadmin vulnerability summary
kubernetes之服务发现
想吃菌子,当然是自己上山找了
深度学习基本概念