代码改变世界

值传递和引用传递的区别

2017-03-25 10:41  大写的Z  阅读(12204)  评论(0编辑  收藏  举报
值传递仅仅传递的是值。

引用传递,传递的是内存地址,修改后会改变内存地址对应储存的值。
用数组来举例就最清楚了,例如我们定义一个数组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;
}


值传递是只把对象的值传入函数,函数中可以使用这个值,但却无法更改该对象的值。我这里以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的值在函数中被改变了。

引用传递:

function curve(arr, amount) {
for (var i = 0; i < arr.length; ++i) {
arr[i] += amount;
}
}
var grades = [77, 73, 74, 81, 90];
curve(grades, 5);
print(grades); // 显示82,78,79,86,95