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中的方法中传递对象时,其实也是值传递,表面上你在函数调用时可以修改传入对象的状态,但是实际对象没有发生改变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值