形参与实参

本文探讨了函数调用中参数传递的方式及其实现原理。详细解释了为什么在某些情况下,即使看起来进行了变量值的交换,实际上传统的过程调用并不能改变原始变量的值。文章进一步介绍了如何通过指针来实现这一目标。

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


这个程序看似把a,b的值互换了实则没有,形参没办法改变实参的值;a还是=1,b还是2.

父函数调用子函数形参变量只在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元

只有用指针才能改变主函数的值

1.传指针。直接将实参的地址进行传递。

2.解引用。通过对指针解引用,去修改其中的值。


但是当对置空的指针解引用则会引起程序崩溃


但是下面这个程序却没崩溃


因为实参与形参地址不同,所以形参的改变并不会对实参产生影响。



### C#中参与实参的概念及区别 在C#中,函数的参数分为**参**(式参数)和**实参**(实际参数)。它们是函数调用机制中的重要组成部分。以下是关于参与实参的概念、区别及使用方法的详细说明。 #### 1. 参与实参的定义 - **参**:在定义函数时指定的参数,用于接收调用函数时传递的数据。参只在函数内部有效,并且只有在函数被调用时才会分配内存单元[^3]。 - **实参**:在调用函数时传递给函数的具体数据或变量。它可以是常量、变量、表达式或函数返回值等,只要在调用时具有确定的值即可。 #### 2. 参与实参的区别 - **内存分配**: - 参的内存单元是在函数调用时动态分配的,在函数调用结束后立即释放[^3]。 - 实参的内存单元由其定义位置决定,不会因函数调用而改变其生命周期。 - **数据传递方向**: - 数据从实参传递到参,即实参的值会复制给参[^4]。 - 参的值变化不会影响实参,除非通过引用传递方式(如 `ref` 或 `out` 关键字)。 - **类型匹配**: - 参和实参必须在数量、类型和顺序上严格一致,否则会导致编译错误[^3]。 #### 3. 参与实参的使用方法 根据传递方式的不同,C# 中的参可以分为以下几种: - **值传递(Value Passing)**: 在值传递中,实参的值会被复制到参中,因此对参的修改不会影响实参[^4]。 ```csharp static void ChangeValue(int num) { num = 10; // 修改参的值 } static void Main() { int num = 5; ChangeValue(num); // 传递实参的值 Console.WriteLine("num = " + num); // 输出结果为5,因为参的变化不影响实参 } ``` - **引用传递(Reference Passing)**: 使用 `ref` 或 `out` 关键字可以实现引用传递,允许函数直接操作实参的值[^1]。 ```csharp static void ChangeValue(ref int num) { num = 10; // 修改参的值 } static void Main() { int num = 5; ChangeValue(ref num); // 传递实参的引用 Console.WriteLine("num = " + num); // 输出结果为10,因为参的变化影响了实参 } ``` - **输出参数(Output Parameters)**: 使用 `out` 关键字可以在函数调用后将参的值赋给实参[^5]。 ```csharp static void GetValues(out int a, out int b) { a = 10; b = 20; } static void Main() { int x, y; GetValues(out x, out y); Console.WriteLine("x = " + x + ", y = " + y); // 输出结果为x=10, y=20 } ``` - **数组或对象传递**: 当传递数组或对象时,实际上传递的是引用。因此,对参的操作可能会影响实参指向的对象。 ```csharp class Program { public int v1 = 20; static void ModifyObject(Program obj) { obj.v1 += 5; // 修改对象的字段 } static void Main() { Program p = new Program(); ModifyObject(p); Console.WriteLine("v1 = " + p.v1); // 输出结果为25 } } ``` ### 总结 在C#中,参和实参是函数调用的核心概念。理解它们的区别和使用方法对于编写高效、可靠的代码至关重要。值传递适用于简单数据类型,而引用传递则适合需要修改实参的情况。此外,数组和对象的传递实际上是引用传递,需特别注意其行为特点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值