值传递和引⽤传递的区别
值传递仅仅传递的是值。
引⽤传递,传递的是内存地址,修改后会改变内存地址对应储存的值。
⽤数组来举例就最清楚了,例如我们定义⼀个数组a[]={1,2};那么a[0]=1, a[1=2].
如果我们把数组a⾥的元素值作为参数传递,实际上只是进⾏了值传递,对数组本⾝没有影响
如果我们把数组a的指针作为参数传递,那么假如处理的函数就可以直接修改数组a⾥的值。
代码实例:(只是写个⼤概的逻辑,语法可能有错误)
main(){
int a[]={1,2};
函数printftest(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