C-值传递与引用传递详解-中的参数传递 (c 值传递)
简介
C 是一种面向对象的编程语言,支持多种参数传递方式,包括传值和传引用两种方式。在本文中,我们将讨论 C 中的参数传递方式以及如何使用它们来实现不同的交互模式。
参数传递方式
在 C 中,参数传递方式主要有两种:传值(值类型)和传引用(引用类型)。
![中的参数传递](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
传值
将值类型的变量作为参数传递时,实际上是将该变量的值复制一份作为参数传递。这意味着在方法内部修改该变量的值并不会影响原始变量的值。
public void SetValue(int val) { val = 10; }
传引用
将引用类型的变量作为参数传递时,实际上是将该变量的地址复制一份作为参数传递。这意味着在方法内部修改该变量所指向的对象的值会影响原始变量所指向的对象的值。
public void SetArrayValue(int[] arr) { arr[0] = 10; }
交互模式
参数传递方式可以用来实现不同的交互模式,包括:
单向交互模式
在单向交互模式中,方法只从调用者那里接收数据,而不会将任何数据返回给调用者。例如,SetValue 方法就是一种单向交互模式,它接收一个整型的参数,并将该参数的值设置为 10。
双向交互模式
在双向交互模式中,方法既可以从调用者那里接收数据,也可以将数据返回给调用者。例如,SetArrayValue 方法就是一种双向交互模式,它接收一个整数数组作为参数,并将数组的第一个元素设置为 10。
回调交互模式
在回调交互模式中,方法将一个函数作为参数传递给另一个方法,然后由另一个方法来调用该函数。例如,以下代码使用回调交互模式实现了对数组的排序:
public void SortArray(int[] arr, FunccompareFunc) { 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。
那么对行参的修改,不会影响实参的值 。引用传递: 实际是传值的一种特殊方式,只是他传递的是地址,不是普通的赋值,那么传地址以后,实参和行参都指向同一个对象,因此对形参的修改会影响到实参。
扩展资料
传值调用中,只使用了实参的值。传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。在引用调用机制里,将实参的地址传递给形参,从表面上看是以实参变量取代形参,因此任何发生在形参上的改变实际上都发生在实参变量上。
引用传递是将变量的内存地址传递给方法,方法操作变量时会找到保存在该地址的变量,对其进行操作。会对原变量造成影响。可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
参考资料:网络百科—引用传递
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。