当前位置:首页 > 数码 > C-值传递与引用传递详解-中的参数传递 (c 值传递)

C-值传递与引用传递详解-中的参数传递 (c 值传递)

admin4个月前 (05-13)数码30

简介

C 是一种面向对象的编程语言,支持多种参数传递方式,包括传值和传引用两种方式。在本文中,我们将讨论 C 中的参数传递方式以及如何使用它们来实现不同的交互模式。

参数传递方式

在 C 中,参数传递方式主要有两种:传值(值类型)和传引用(引用类型)。

中的参数传递

传值

将值类型的变量作为参数传递时,实际上是将该变量的值复制一份作为参数传递。这意味着在方法内部修改该变量的值并不会影响原始变量的值。

public void SetValue(int val)
{
  val = 10;
}
  

传引用

将引用类型的变量作为参数传递时,实际上是将该变量的地址复制一份作为参数传递。这意味着在方法内部修改该变量所指向的对象的值会影响原始变量所指向的对象的值。

public void SetArrayValue(int[] arr)
{
  arr[0] = 10;
}
  

交互模式

参数传递方式可以用来实现不同的交互模式,包括:

单向交互模式

在单向交互模式中,方法只从调用者那里接收数据,而不会将任何数据返回给调用者。例如,SetValue 方法就是一种单向交互模式,它接收一个整型的参数,并将该参数的值设置为 10。

双向交互模式

在双向交互模式中,方法既可以从调用者那里接收数据,也可以将数据返回给调用者。例如,SetArrayValue 方法就是一种双向交互模式,它接收一个整数数组作为参数,并将数组的第一个元素设置为 10。

回调交互模式

在回调交互模式中,方法将一个函数作为参数传递给另一个方法,然后由另一个方法来调用该函数。例如,以下代码使用回调交互模式实现了对数组的排序:

public void SortArray(int[] arr, Func compareFunc)
{
  for (int i = 0; i < arr.Length; i++)
  {
    for (int j = i + 1; j < arr.Length; j++)
    {
      if (compareFunc(arr[i], arr[j]))
      {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
  }
}
  

总结

在本文中,我们讨论了 C 中的参数传递方式以及如何使用它们来实现不同的交互模式。传值和传引用是 C中最常见的参数传递方式,它们分别具有不同的特点和应用场景。我们还介绍了单向交互模式、双向交互模式和回调交互模式等常见的交互模式,并给出了相应的示例代码。希望本文能够帮助您更好地理解 C 中的参数传递方式和交互模式。


C#值传递和引用传递的理解

说到参数传递,必须得弄清值类型和引用类型:(为了容易表达,我暂且命名存放在堆中的内容为堆中对象,存放在栈上的内容为栈中对象。 )值类型存放在栈中,直接访问。 如果有:int a=0;int b=a;就产生了两个栈中对象。 引用类型需要在堆中显式分配,且不能直接访问,需要在栈中分配一个栈中对象(C++叫指针,C#叫引用)指向其堆中对象。 如果:StringBuilder strb = new StringBuilder();StringBuilder strb2 = strb;则在堆中只有一个堆中对象,只是栈中有两个栈中对象指向堆中对象。 可以看出:每个变量都是一个栈中对象。 不管是值类型还是引用类型,只是值类型的栈中对象就是其内容,而引用类型的栈中对象只是一个指向堆中对象的地址。 判断是值类型还是引用类型:int a1 = 10;StringBuilder strb1 = new StringBuilder(ABC);int a2 = a1;StringBuilder strb2 = strb1;bool bl1 = (a1,a2); //false为值类型(因为值类型要装箱)bool bl2 = (strb1,strb2); //true为引用类型参数传递分值传递和引用传递两种。 通常,在没有显式指出ref和out时都是值传递。 值传递:传的是对象的值拷贝。 (即函数内参数对象是调用时传递对象的栈中对象的拷贝。 )引用传递:传的是栈中对象的地址。 (即函数内参数对象与调用时传递对象完全是同一栈中对象。 )现在用例子来说明传值跟传地址的不同:private void button2_Click(object sender, e){StringBuilder strb1 = new StringBuilder();StringBuilder strb2 = new StringBuilder();Test1(strb1);Test2(ref strb2);string str1 = (); //str1值:Astring str2 = (); //str2值:BC}void Test1(StringBuilder strb){//strb和strb1是两个栈中对象,但指向相同的地址,这个操作是改变堆中对象(A);//这里将strb指向一个新的堆中对象,所以后面的操作与strb1指向的栈中对象无关strb = new StringBuilder(B);(C);}void Test2(ref StringBuilder strb){//这里的strb和strb2是同一个栈中对象,所以改变strb的值使其指向另一个对象也等于改变strb2strb = new StringBuilder(B);(C);}

函数中,实参与形参的数据传递方式是?

函数实参与形参之间的数据传递方式是( 值传递)传递方式,在C语言中,数据传递方式有值传递和引用传递,值传递:传值,实际是把实参的值赋值给行参,相当于copy。

那么对行参的修改,不会影响实参的值 。引用传递: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。

扩展资料

传值调用中,只使用了实参的值。传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。在引用调用机制里,将实参的地址传递给形参,从表面上看是以实参变量取代形参,因此任何发生在形参上的改变实际上都发生在实参变量上。

引用传递是将变量的内存地址传递给方法,方法操作变量时会找到保存在该地址的变量,对其进行操作。会对原变量造成影响。可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。

参考资料:网络百科—引用传递

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: C#

“C-值传递与引用传递详解-中的参数传递 (c 值传递)” 的相关文章

Task.Run-异步编程的比较-C-async-与 (task.run方法)

Task.Run-异步编程的比较-C-async-与 (task.run方法)

概述: C#中的异步编程有两重要形式:Task.Run用于在后盾线程口头同步操作,而async-awt更适用于明晰表白异步流程。基础用法展现了它们的便捷运行,初级用规律展示了它们的联合...

与-终极指南-文件压缩-SharpZipLib-精通-พร้อม实用代码范例-DotNetZip-C (终极指南针官方网站)

与-终极指南-文件压缩-SharpZipLib-精通-พร้อม实用代码范例-DotNetZip-C (终极指南针官方网站)

目录压缩是一种将一系列文件或目录打包成单个存档文件的过程。此过程可用于备份、传输或节省磁盘空间。目录解压缩是将存档文件还原到其原始状态的过程。 有许多不同的目录压缩和解压缩工具可用。最流行的...

15-C-个顶级开源项目-中值得收藏的

15-C-个顶级开源项目-中值得收藏的

简介 MediatR 是 .NET 平台上一个轻量级库,它简化了命令查询责任分离 (CQRS) 模式的实现。CQRS 是一个设计模式,它将应用程序中的命令和查询分离成不同的组件。这可以提高应...

及其初级控件摸索之旅-深化了解跨平台开发畛域的弱小工具-C (及其初级控件有哪些)

及其初级控件摸索之旅-深化了解跨平台开发畛域的弱小工具-C (及其初级控件有哪些)

前几天一个学员在学习C#与初级控件交互时,也不知道初级控件可以用来做什么。 上方咱们就具体讲讲C#和初级控件交互的关系常识。 C#是一种配置丰盛的面向对象编程言语,它蕴含了许多初级控件...

C-线程本地存储-深化了解线程间值差别 (c++线程 window)

C-线程本地存储-深化了解线程间值差别 (c++线程 window)

为什么用ThreadStatic标志的字段,只要第一个线程拿到了初始值,其余线程都是自动值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给前面相似不懂的好友解...

C#开发三个关键的内存区域-非托管堆内存和栈内存-托管堆内存 (c#开发实战)

C#开发三个关键的内存区域-非托管堆内存和栈内存-托管堆内存 (c#开发实战)

对内存的治理和操作大部分都是由运转时处置的。开发者无需过多关注内存治理的细节,由于托管堆内存的渣滓回收机制可以智能处置对象的调配和监禁。但是,在特定状况下,如与非托管代码交互、启动性能优化或处置少量数...

深入探索C中的LINQ魔法-功能概述和源代码剖析-b-b (进行深入探索)

深入探索C中的LINQ魔法-功能概述和源代码剖析-b-b (进行深入探索)

简介 LINQ(语言集成查询)是一种用于 C 中的数据查询和操作的强大工具。它允许开发人员使用类 C 语法而不是 SQL 语句来查询和操作各种数据源,例如集合、数组和 XML 文档。 20...