当前位置:网站首页>函数的参数
函数的参数
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()函数调用是传址调用。
总结来说,传值调用的函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
边栏推荐
- Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
- Json和对象之间转换的封装(Gson)
- Docker搭建Mysql主从复制
- 【Shader】Shader官方示例[通俗易懂]
- Spark GC日志分析
- 深度学习基本概念
- Banyan Tree Loan GPU Hardware Architecture
- Experience innovation and iteration through the development of lucky draw mini-programs
- 一周精彩内容分享(第14期)
- Full GC (Ergonomics)排查分析
猜你喜欢
AWS Amazon cloud account registration, free application for 12 months Amazon cloud server detailed tutorial
JVS函数公式使用场景介绍
DCM middleware family welcomes a new member
Full GC (Ergonomics)排查分析
消息队列面试题(2022最新整理)
纷享销客罗旭对话元气森林黄晓枫:零售数字化的终点不是创新,而是数据
Android studio connects to MySQL and completes simple login and registration functions
LeetCode - 025. 链表中的两数相加
Docker installs canal and mysql for simple testing and achieves cache consistency between redis and mysql
TOGAF10标准读书会第2场活动精彩继续,高光时刻回顾!
随机推荐
科学论文和学术论文写作
Character Functions and String Functions
Mysql环境变量的配置(详细图解)
在 Excel 内使用 ODBC 消费 SAP ABAP CDS view
ESP8266-Arduino编程实例-MCP9808数字温度传感器驱动
音视频基础
【核心概念】图像分类和目标检测中的正负样本划分以及架构理解
[core]-ARMV7-A、ARMV8-A、ARMV9-A 架构简介「建议收藏」
连续变量离散化教程
Obsidian设置图床
Use jOOQ to write vendor-agnostic SQL with JPA's native query or @Formula.
想吃菌子,当然是自己上山找了
深度学习基本概念
MySQL百万数据优化总结 一
MySQL模糊查询性能优化
订song餐系统
R语言:文本(字符串)处理与正则表达式
荣耀手机参数写错,客服认为没错
SAP Commerce Cloud Product Review 的添加逻辑
busybox之reboot命令流程分析