值传递和引用传递的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值传递和引用传递的区别相关的知识,希望对你有一定的参考价值。
值传递仅仅传递的是值引用传递,传递的是内存地址,修改后会改变内存地址对应储存的值。
用数组来举例就最清楚了,例如我们定义一个数组a[]=1,2;
那么a[0]=1,a[1]=2。
如果我们把数组a里的元素值作为参数传递,实际上只是进行了值传递,对数组本身没有影响
如果我们把 数组a的指针作为参数传递,那么假如处理的函数就可以直接修改数组a里的值。
代码实例:(只是写个大概的逻辑,语法可能有错误)
main()
int a[]=1,2;
test(a);
printf(a[0]); //此处打印的值是3, 这就是引用传递。
public void test(int b[])
b[0]=3;
参考技术A 值传递是只把对象的值传入函数,函数中可以使用这个值,但却无法更改该对象的值。我这里以c语言为例
如:
void a(int v)
printf(v);
v++;
printf(v);
void main()
int b = 0;
a(b);
printf(b);
最后结果为010
这里b的值在a函数中被调用,但是b本身没变。其实值传递相当于在函数中新建了一个对象然后对它赋值再使用。在上例中相当于:
void a(int v)
int b = v;
printf(b);
b++;
printf(b);
应用传递是将整个对象本身(或地址)传入函数,在函数中既可调用对象的值,也可改变对象的值。如下:
void a(int* v) //传入的参数为指针
printf(*v);
*v++;
printf(*v);
void main()
int b = 0;
a(&b); //&的意思是取b的地址(指针)
printf(b);
这里的输出结果是011,说明b的值在函数中被改变了。 参考技术B 在不同的编程语言中可能会大同小异吧
在C#中,这些都是针对方法而言的。
值传递指的是方法被调用时传递进来的参数是一个副本(拷贝),而不是传递进来参数本身。换句话说对值传递参数的修改不会影响到调用方传递的参数对象;
而引用传递指的是方法被调用时传递进来的参数是一个引用,换句话说传递进来的参数是指向调用方传递的参数本身的。对引用传递的参数的修改会影响到调用方传递的参数对象。 参考技术C 假设$a = 1;$a的值是1,它有一个地址比如是aaa;值传递就是把$a的值传过去,其实相当于新设了一个变量,它和$a除了值相等外没任何关系;引用传递则是把$a的地址传过去,那么地址的值变了,$a自然也跟着变了。如:
$a = 1;function get_a($a)$a=2; get_a($a);echo $a;输出结果还是1,这里是值传递;
$a = 1;function get_a(&$a)$a=2;;get_a($a);echo $a;输出结果是2,这里是引用传递。 参考技术D C++中参数传递方式有三种:传递参数值、传递参数地址、传递参数的引用。
函数定义是参数表中的参数称为形参。函数调用时参数表中的参数称为实参。一般C++都是传递参数的值,参数的值只能从实参传递给形参,反之不行。对于被调用的函数,参数的值只能传入不能传出。此时实参可以是具体的值(变量)或者表达式,所以传值调用本质上是传递表达式。当函数被调用时,系统首先对实参表达式求值再传递给形参。
对于基本数据类型,传递的是数据的拷贝;对于引用数据类型,传递的是引用的拷贝
值传递和引用传递怎么理解?
这个应该是c语言里的吧。参数的值传递,就是复制,用比喻的方法讲就是在函数里,这个参数的引用就是捏泥人一样,泥人是和你真人一样的,但不是你真人是个复制品,对泥人的修改不影响你真人的形态。
参数的引用传递,就不同了,由于参数是地址,对地址的复制可以通过地址直接找到变量的内容,所以对变量的修改是能够直接影响外部的值的,这个用比喻的方法,就是钥匙,复制了钥匙尽管不是原配钥匙但是可以打开门,就很危险 参考技术A 一般发生在对象类上,值传递可以理解为新建内存空间,引用,只是用同一个地址,不新开辟内存 参考技术B 简单理解:
值传递 :当这个对象被改变的时候,不会改变原来的值
引用传递 :当这个对象被改变的时候,会改变原来的值 参考技术C 引用传递可以被考虑为特定的值传递——引用对象的内存地址(值)传递。
以上是关于值传递和引用传递的区别的主要内容,如果未能解决你的问题,请参考以下文章