在C语言当中
在C语言当中,函数参数传递大体上可分为三种
第一种:传递的是简单变量或者是数组元素
#include <stdio.h>
#include <stdlib.h>
int change(int one,int another);
int main()
{
int a,b;
a=1;
b=2;
change(a,b);
printf("%d",a);
}
int change(int one,int another){
int temp;
temp=one;
one=another;
another=temp;
printf("%d\n",one);
}
可以发现,a和b的值并没有交换。在 C 语言中,所有函数参数都是“通过值”传递的。也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中,被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。因此上面的a和b并没有交换。
第二种:传递的是指针变量或数组名
1.指针变量
#include <stdio.h>
#include <stdlib.h>
int change(int *one,int *another);
int main()
{
int a,b;
a=1;
b=2;
change(&a,&b);
printf("%d",a);
}
int change(int *one,int *another){
int temp;
temp= *one;
*one= *another;
*another=temp;
printf("%d\n",*one);
}
指针保存着变量在内存中的地址,因为函数是以值的形式传递的,因此传入函数中的是这个地址的一个“拷贝”。由于两个指针指向同一内存空间,因此函数内对内存空间,也就是变量的修改,会反应的函数外面,所以这个swap函数成功实现了交换功能。
2.传递的是数组名
void
f1(
char
*s) {
printf
(
"%s\n"
, s);}
void
f2(
char
sa[]) {
printf
(
"%s\n"
, sa);}
int
main()
{
char
rsa[] =
"world hello"
;
f1(rsa);
f2(rsa);
return
0;
}
void
f1(
char
*s) {
printf
(
"%s\n"
, s);}
void
f2(
char
sa[]) {
printf
(
"%s\n"
, sa);}
第三种:引用作为函数参数
引用是c++的特性,c语言本身不支持直接传入引用
在Javascript中
在javascript中,没有引用传递,只有值传递。也就是说,无论是基本类型,还是引用类型,传入函数中的都是外部函数的值的拷贝。
例如基本类型:
function addTen(num){
num + =10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20
alert(result);//30
从这点可以看出,传入参数中的值和外部的值是没有关系的
引用类型:
function setName(obj){
obj.name = "a";
}
var person = new Object();
setName(person);
alert(person.name); //a
有些人可能会疑惑,为什么函数内的改变会影响函数外的值,因此误以为引用类型也是按引用传递的,在看一个例子
function setName(obj){
obj.name = "a";
obj = new Object();
obj.name="b";
}
var person = new Object();
setName(person);
alert(person.name); //"a"
如果是按引用传递的话,那么“person.name”就会是"b"。所以从这里看出引用类型也是按值传递的。实际上对象等引用类型是保存在堆内存空间中的,而我们不能直接读写堆内存,因此需要间接的更改。可以把对象名看成 指针,它指向堆内存空间中实际的对象,通过它就可以操作对象了。当传入函数中时,是将这个指针拷贝了一份,传入函数中的,由于函数内部和外部都指向的是相同的对象,所以更改内部会反应在外部,但当改变内部指针的时候,例如让它指向其他对象时,外部指针还是不变的。所以说,在javascript中,函数参数的传入都是按值传递的。