当前位置:网站首页>函数的参数
函数的参数
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()函数调用是传址调用。
总结来说,传值调用的函数形参和实参分别占有不同的内存块,对形参的修改不会影响实参。传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式,这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
边栏推荐
- JVS应用中心
- Three-Phase PWM Rectifier Predictive Direct Power Control
- How MySQL's allowMultiQueries flag relates to JDBC and jOOQ
- A40i/T3 uboot启动时对PMU部分初始化
- mysql根据多字段分组——group by带两个或多个参数
- imx6ull看门狗使用
- SAP Commerce Cloud Product Review 的添加逻辑
- 三六零与公安部三所发布报告:关基设施保护成为网络安全博弈关键
- Acwing第 62 场周赛【未完结】
- Three-tier architecture service, dao, controller layer
猜你喜欢

kubernetes之服务发现

Service discovery of kubernetes

音视频基础

A Week of Wonderful Content Sharing (Issue 14)

使用docker搭建mysql主从

机器学习基本概念

Exploring Plain Vision Transformer Backbones for Object Detection 论文阅读笔记

vb.net 画曲线

WebGL给Unity传递参数问题1: Cannot read properties of undefined (reading ‘SendMessage‘)

The most complete phpmyadmin vulnerability summary
随机推荐
dosbox基础使用[通俗易懂]
St. Regis Takeaway Project: New dishes and dishes paged query
双非一本进字节了!!纯干货分享
cesium-Web网页优化进阶
JVS开发套件产品定位
快速学完数据库管理
R 语言data.frame 中的另一行中减去一行
JVS轻应用的组成与配置
R语言:文本(字符串)处理与正则表达式
vb.net 画曲线
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
LeetCode - 025. 链表中的两数相加
Character Functions and String Functions
Initial JDBC programming
第十二章 使用中的 OpenAPI 属性
mysql根据多字段分组——group by带两个或多个参数
MySQL limit paging query and performance issues
PAT考试总结(考试心得)
VBA实现双击单元格自动输出对号再次双击取消对号
[core]-ARMV7-A, ARMV8-A, ARMV9-A Architecture Introduction "Recommended Collection"