1.值传递
这个大部分程序语言都有以下以C语言为例;
#include<stdio.h>
void swap(int a,int b)
{
int c = b;
b = a;
a = c;
}
int main(int argc,char**argv)
{
int a = 1,b = 0;
printf("%d %d\n",a,b);
swap(a,b);
printf("%d %d",a,b);
return 0;
}
输出:
1 0
1 0
显然a,b的值并未发生改变,何故?
因为我们编译器在调用参数的时候会发生形参拷贝实参的过程,所以最后其实交换的是形参的值
如果我们想要改变实参的值也简单,使用引用传递。
2.引用传递
#include<stdio.h>
void swap(int* a,int* b)
{
int c = *b;
*b = *a;
*a = c;
}
int main(int argc,char**argv)
{
int a = 1,b = 0;
printf("%d %d\n",a,b);
swap(&a,&b);
printf("%d %d",a,b);
return 0;
}
输出:
1 0
0 1
相信不少读者看到这里会反驳:这不是引用传递,这是址传递,引用传递参数是int &a,int &b
但其实引用就是获取变量地址,所谓的int &a = c;本质也是通过指针实现,术本同源
3.名传递
被早期程序设计语言Algol60使用,它要求被调用者的运行方式是用实在参数以字面方式替换了被调用者的代码中的形式参数。当实在参数是一个表达式而不是一个变量时,会发生一些和直觉不服的问题,这也是今天不再采用这种机制的原因之一,但scala又使用了这一传递