c语言中形参和实参的区别?

形式参数和实际参数 
函数的参数分为形参和实参两种。在本小节中,进一步介绍形参、实参的特点和两者的关系。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。 
函数的形参和实参具有以下特点: 
1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。 
2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。 
3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。 
4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。 

【例】可以说明这个问题。 
main() 
{ 
int n; 
printf("input number\n"); 
scanf("%d",&n); 
s(n); 
printf("n=%d\n",n); 
} 
int s(int n) 
{ 
int i; 
for(i=n-1;i>=1;i--) 
n=n+i; 
printf("n=%d\n",n); 
} 

本程序中定义了一个函数s,该函数的功能是求∑ni的值。在主函数中输入n值,并作为实参,在调用时传送给s 函数的形参量n( 注意,本例的形参变量和实参变量的标识符都为n,但这是两个不同的量,各自的作用域不同)。在主函数中用printf 语句输出一次n值,这个n值是实参n的值。在函数s中也用printf 语句输出了一次n值,这个n值是形参最后取得的n值0。从运行情况看,输入n值为100。即实参n的值为100。把此值传给函数s时,形参n的初值也为100,在执行函数过程中,形参n的值变为5050。返回主函数之后,输出实参n的值仍为100。可见实参的值不随形参的变化而变化。
### C语言形参实参的概念及区别 #### 一、形参实参的定义 在C语言中,函数调用时会涉及两个重要的概念——形参式参数)实参(实际参数)。 - **形参**是指在函数声明或定义时使用的变量名,用于接收外部传入的数据。这些变量仅存在于函数内部,在函数执行完毕后会被销毁[^1]。 - **实参**是在调用函数时传递给该函数的具体数据值或表达式。实参可以是常量、变量或者更复杂的表达式。 #### 二、形参实参的类型匹配 为了保证程序能够正常运行并得到预期的结果,形参实参之间需要满足一定的类型匹配规则: - 如果两者类型不一致,则编译器可能会尝试自动转换实参的类型以适应形参的要求。如果无法完成这种隐式的类型转换,将会引发错误[^2]。 - 对于基本数据类型的大小差异需要注意其占用内存空间的不同,比如`char`通常只占一个字节而`double`可能占据八个字节等[^3]。 #### 三、指针作为形参的情况分析 当使用指针作为形参时,意味着可以通过修改指针对应地址处的内容来间接影响原变量的值。例如下面的例子展示了如何利用指针实现两数交换的功能: ```c #include <stdio.h> void swap(int* px, int* py){ int t=*px; *px=*py; *py=t; } int main(){ int a=5,b=7; printf("Before swapping:a=%d b=%d\n",a,b); swap(&a,&b); //通过取址符&获取变量ab的地址,并将其赋值给swap函数中的形参pxpy printf("After swapping :a=%d b=%d\n",a,b); return 0; } ``` 上述代码片段清楚地表明了当我们希望改变原始对象的状态而非仅仅复制一份副本操作时采用引用传递的重要性[^4]。 #### 四、两种主要的参数传递方式对比 ##### 值传递(Value Passing) 在这种模式下,实际发生的只是简单地将实参当前存储位置上的数值拷贝了一份交给对应的形参处理。因此无论后者怎么变化都不会反馈回去影响前者本身。如下所示: ```c void modifyValue(int value) { value *= 2; } int main() { int original = 10; modifyValue(original); printf("%d\n",original); /* 输出仍为10 */ return 0; } ``` 此处即使我们在子函数里改变了value的值也不会反映到main里的original上因为这是完全独立存在的另一个实体[^3]。 ##### 地址传递(Address Passing / Reference Passing via Pointer) 相比之下,如果我们想让某个特定区域内的信息发生变化并且能被外界感知的话就需要借助指针来进行所谓的按引用传递了。此时我们不是单纯地传输具体的数值而是连带着告诉对方应该去访问哪一块儿地方从而达到同步更新的目的如前面提到过的那个关于互换两个整型数字的小例子那样做即可达成目标效果。 --- ### 结论总结 综上所述,C语言提供了灵活多样的方法让我们可以根据具体需求选择合适的手段来进行有效的沟通交流同时也提醒大家注意区分好各个层次之间的关系以免造成不必要的混淆误解最终导致项目失败等问题发生. 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值