当前位置:网站首页>函数的参数
函数的参数
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()函数调用是传址调用。
总结来说,传值调用的函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
边栏推荐
- Three-tier architecture service, dao, controller layer
- kubernetes之服务发现
- Use Excel to read data exposed by SAP ABAP CDS View through ODBC
- A40i/T3 uboot启动时对PMU部分初始化
- After Effects 教程,如何在 After Effects 中修复曝光不足的镜头?
- deeplab implements its own remote sensing geological segmentation dataset
- lotus-local-net 2k v1.17.0-rc4
- Candence学习篇(11) allegro中设置规则,布局,走线,铺铜
- Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
- 带有对称约束切换线性系统的结构可控性
猜你喜欢

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

mysql根据多字段分组——group by带两个或多个参数

apisix-Getting Started

Read through the interface to call the artifact RestTemplate

安装MYSQL遇到问题:write configuration file卡主

kernel syscore

Different lower_case_table_names settings for server ('1') and data dictionary ('0') solution

Distributed id solution

The latest MySql installation teaching, very detailed

三六零与公安部三所发布报告:关基设施保护成为网络安全博弈关键
随机推荐
JVS低代码能力简介及功能清单
ESP8266-Arduino编程实例-HDC1008温度湿度传感器驱动
Getting started with jmeter performance testing steps (performance testing tool jmeter)
普林斯顿微积分读本03第二章--编程实现函数图像绘制、三角学回顾
Docker practical experience: Deploy mysql8 master-slave replication on Docker
Wearing detection and action recognition of protective gear based on pose estimation
dosbox基础使用[通俗易懂]
在 Excel 内使用 ODBC 消费 SAP ABAP CDS view
荣耀手机参数写错,客服认为没错
JVS应用中心
After class, watching the documentation and walking back to the lab, I picked up the forgotten SQL operators again
列表页优化思路
apisix-Getting Started
Data Persistence Technology - MP
安装MYSQL遇到问题:write configuration file卡主
IDEA configure method annotation automatic parameters
How to correctly write the binary stream of the file returned by the server to the local file and save it as a file
[core]-ARMV7-A、ARMV8-A、ARMV9-A 架构简介「建议收藏」
WebGL给Unity传递参数问题1: Cannot read properties of undefined (reading ‘SendMessage‘)
MySQL模糊查询性能优化