C语言中函数形参与实参的区别

本文深入解析了函数参数的概念,区分了形参与实参,并详细解释了它们在C语言中的工作原理,包括值传递和地址传递的区别及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知一个函数有两种参数,即形参和实参。那么究竟什么是形参什么是实参呢?

形参:在定义函数时指定的参数,在未出现函数调用时,他们并不占用内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在函数调用结束后,形参所占用的内存单元也被释放。

实参:即你调用函数时传递的参数。实参可以是常量、变量、表达式。

注意:形参和实参实际上占用的是两份不同的存储单元。

 形参和实参之间的传递

在c语言中,实参与形参的数据传递是“值传递”,单向传递,只能由实参传给形参,不能由形参传递给实参。形参的值如果发生改变,并不会改变主调函数的实参的值。

形参与实参的之间的传递分类

1、按值传递(实形无联系)

按传递就是平常编程中经常用到的,定义一个基本数据类型的变量,在调用某函数时把该变量作为函数的实参传递给函数。这种传递方式采用的是单向值传递,实形无联系,形参改变不影响实参。

2、按地址传递(通过操作形参可能会改变实参)

按地址传递主要出现在函数参数是指针变量、数组等的时候。

注意:

实质上用指针做函数参数的情况下,在调用函数时,将实参变量的传递给形参变量,采取的依然是单向值传递。如果在被调函数中只是单纯改变了形参指针变量的值,在函数调用结束后这些形参被销毁,是不会影响调用函数时传入实参指针变量值。

只有当你在被调函数中通过操作形参指针变量,去改变了指针指向变量的值时,才可以改变实参指针变量所指向变量的值。也只有这种情况下形参改变才可能影响实参。

实质上,指针操作起到了偷梁换柱的作用。

关于指针请自行了解。

 

 

### C语言形参实参区别 #### 定义与概念 在C语言中,**实参**是指实际传递给函数的具体变量或常量值,而**形参**则是函数定义中的占位符,用于接收这些具体值。两者之间的关系通过函数调用来建立。 - **实参(Actual Parameter)**: 是指在程序运行过程中向函数传递的实际数据。它可以在`main()`或其他函数内部声明并初始化[^1]。 - **形参(Formal Parameter)**: 函数头部定义的参数列表中的变量名,在函数体内部使用它们来操作传入的数据[^2]。 #### 数据传递方式 主要存在两种基本的数据传递机制——按值传递和地址传递: 1. **值传递(Pass by Value)** 当采用值传递的方式时,仅将实参的副本送至形参位置执行相应处理逻辑,这意味着即使修改了形参也不会影响原始实参的内容[^2]。 ```c void modifyValue(int num){ num *= 2; printf("Inside function: %d\n",num); } ``` 2. **地址传递(Pass by Reference via Pointer)** 若希望改变原对象的状态,则需利用指针实现间接访问目标内存单元的技术手段完成此目的。此时我们说实现了所谓的“引用”效果[^3]。 ```c void modifyPointer(int* ptrNum){ (*ptrNum)++; printf("After increment inside func:%d ",*ptrNum); } ``` #### 名字冲突情况下的行为表现 如果在同一作用域内的不同层次间出现了相同名字的情况怎么办呢?比如下面这段代码展示了当局部变量(即形参)m,n分别与其对应的全局版本发生重叠现象后的运作情: ```c #include <stdio.h> //计算从m加到n的值 int sum(int m, int n) { int i; for (i = m + 1; i <= n; ++i) { m += i; } return m; } int main() { int m=5 ,n=8,total; total=sum(m,n); printf("Global scope:m=%d, n=%d\n",::m, ::n); //显示外部链接实体而非当前块级范围成员 printf("Function result:Total Sum is %d.\n",total); return 0; } ``` 尽管如此,由于编译器会优先考虑最近的有效声明,所以不会引起混淆或者错误的结果输出[^3]. #### 总结 综上所述,C编程环境里的式化参数仅仅充当临时存储容器的角色而已,只有在其所属的方法体内才有效果可言;相反地,真实世界里所提供的那些初始数值才是贯穿整个应用程序生命周期的关键所在.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值