学过编译原理以后,我们都知道函数的参数传递有两种,分别是值传递和引用传递(又叫地址传递)。
值传递,函数只调用时,只是将实参的值拷贝到形参中,在函数里面操作都是针对形参,而在函数调用完毕以后形参所占的空间会被释放,这样在调用前后不会对实参的值产生任何影响。
引用传递,又叫地址传递。顾名思义,那就是在函数调用时,将实参的地址传给形参,换句话说就是实参和形参在内存共用了一片空间,因此在函数中修改形参的值也就同时修改了实参的值。
目前接触过语言C/C++、Java对函数参数传递的支持情况:
[table]
|语言 |值传递 |引用传递|
|C/++ |支持 |支持|
|Java |支持 |不支持|
[/table]
现在就以C++语言为例,谈谈自己对函数参数传递的一些认识。在网上看了好多文章,还有很多书中对将C++的参数传递分为三种,在上面说的那两种的基础上又多出了一个指针传递。大家知道通过指针传递也可以修改实参的值,所以大家可能也有一种误解指针传递是引用传递。下面我通过一个例子来说明我自己对指针传递的理解。
如果是引用传递上面那段代码执行的结果应该是aaaa,但实际在执行结果是bbbb。从上面的例子可以看出C/C++中的指针传递实际上也是值传递,其实指针是一种特殊的变量,它的内容是一个变量的地址,我们在指针传递时不能修改指针指向的地址,但是能修改指针指向的地址里面的内容。
从上面那个函数可以看出,实际上是想实现一个字符串拷贝,想把字符串srcStr中的内容拷贝到destStr中,但是指针传递实际是值传递,因此达不到预期的目的,可以做以下修改,达到目的。
[b]方法一:[/b]
[b]方法二:[/b]
此外还有像在C++或者Java中的方法中传递对象时,其实也是值传递,表面上你在函数调用时可以修改传入对象的状态,但是实际对象没有发生改变。
值传递,函数只调用时,只是将实参的值拷贝到形参中,在函数里面操作都是针对形参,而在函数调用完毕以后形参所占的空间会被释放,这样在调用前后不会对实参的值产生任何影响。
引用传递,又叫地址传递。顾名思义,那就是在函数调用时,将实参的地址传给形参,换句话说就是实参和形参在内存共用了一片空间,因此在函数中修改形参的值也就同时修改了实参的值。
目前接触过语言C/C++、Java对函数参数传递的支持情况:
[table]
|语言 |值传递 |引用传递|
|C/++ |支持 |支持|
|Java |支持 |不支持|
[/table]
现在就以C++语言为例,谈谈自己对函数参数传递的一些认识。在网上看了好多文章,还有很多书中对将C++的参数传递分为三种,在上面说的那两种的基础上又多出了一个指针传递。大家知道通过指针传递也可以修改实参的值,所以大家可能也有一种误解指针传递是引用传递。下面我通过一个例子来说明我自己对指针传递的理解。
#include <iostream>
using namespace std;
typedef char* String ;
String strCopy(String destStr, const String srcStr) {
if (srcStr) {
int len = strlen(srcStr);
destStr = new char[len+1];
String tmpDestStr = destStr;
String tmpSrcStr = srcStr;
while(*tmpDestStr++ = *tmpSrcStr++);
tmpDestStr = '\0';
return destStr;
} else {
return NULL;
}
}
void main() {
String testStr =;
strCopy(testStr, "aaaa");
cout<<testStr<<endl;
}
如果是引用传递上面那段代码执行的结果应该是aaaa,但实际在执行结果是bbbb。从上面的例子可以看出C/C++中的指针传递实际上也是值传递,其实指针是一种特殊的变量,它的内容是一个变量的地址,我们在指针传递时不能修改指针指向的地址,但是能修改指针指向的地址里面的内容。
从上面那个函数可以看出,实际上是想实现一个字符串拷贝,想把字符串srcStr中的内容拷贝到destStr中,但是指针传递实际是值传递,因此达不到预期的目的,可以做以下修改,达到目的。
[b]方法一:[/b]
String strCopy(String& destStr, const String srcStr) {
if (srcStr) {
int len = strlen(srcStr);
destStr = new char[len+1];
String tmpDestStr = destStr;
String tmpSrcStr = srcStr;
while(*tmpDestStr++ = *tmpSrcStr++);
tmpDestStr = '\0';
return destStr;
} else {
return NULL;
}
}
[b]方法二:[/b]
#include <iostream>
using namespace std;
typedef char* String ;
String strCopy(String destStr, const String srcStr) {
if (srcStr) {
String tmpDestStr = destStr;
String tmpSrcStr = srcStr;
while(*tmpDestStr++ = *tmpSrcStr++);
tmpDestStr = '\0';
return destStr;
} else {
return NULL;
}
}
void main() {
int len = strlen("aaaa");
String testStr =; new char[len+1];
strCopy(testStr, "aaaa");
cout<<testStr<<endl;
}
此外还有像在C++或者Java中的方法中传递对象时,其实也是值传递,表面上你在函数调用时可以修改传入对象的状态,但是实际对象没有发生改变。