C++语言中函数参数传递方式剖析
2007-08-25谭庆张瑞玲
谭 庆 张瑞玲
摘要:主要剖析了函数参数传递的各种方式,以及它们之间的区别。
关键词:函数参数传普通值调用传地址值调用
引用调用
1传值调用
传值调用是指在函数调用时将实参的值传递给形参,即拷贝一份给形参。形参和实参在内存中有各自独立的存储单元,如果形参的值以后被修改了,那么实参的值不会改变。
在传值调用中,可以分为传普通值调用和传地址值调用两种。传普通值是指传递变量或表达式的值。传地址值是指传递变量的地址值。
1.1传普通值调用
传普通值调用时,形参用变量,实参用变量或表达式。在调用中将实参的值拷贝一份给形参。
例1:传普通值调用
在主函数中,调用swap()函数的两个实参是a和b,其值分别为3和5。调用时实参a将它的值3传递给形参x,实参b将它的值5传递给形参y。
在swap()函数中对形参x和y的值进行了交换。当swap()函数执行完成后,x的值变成了5,v的值变成了3。但实参a和b的值没有改变,仍然是3和5。
可以看到,在调用swap()函数时,由于形参有自己独立的存储单元,存储单元中存放的是对应实参的拷贝副本,因此,当形参的值发生改变时,实参的值不变。
1.2传地址值调用
传地址值调用时,形参用指针,实参用变量的地址。在调用中将实参的值,也就是这个地址拷贝一份给形参。
例2:传地址值调用
执行该程序后,显示如下信息:请输入两个整数a,b:3,5输出结果如下:x指的是5,y指的是3a=5,b=3
在主函数中,调用pswap()函数前变量a和b的值分别为3和5,但调用pswap()函数的两个实参是变量a的地址和变量b的地址,而不是a和b的值。pswap()函数的形参x和y是指向int的指针。调用时将a的地址传递给形参x,将b的地址传递给形参y。
形参x的值是变量a的地址,那么x可以看成是指向a的指针。形参y的值是变量b的地址,那么y可以看成是指向b的指针。执行pswap()函数后将x和y所指的变量的值进行了交换,这样a的值变成了5,b的值变成了。
这里类型要一致。这种调用不拷贝实参的副本,只是将形参“绑定”在实参上。实参和形参在内存中代表相同的存储单元,因此,在被调用函数中,形参引用的改变直接影响到实参变量的改变。
例3:引用调用
在主函数中,调用rswap()函数前变量a和b的值分别为3和5。调用rawap()函数的两个实参是变量a和变量b。rawap()函数的形参是int型引用x和int型引用y。调用时将变量a传递给形参x,将变量b传递给形参v。也就是用a去初始化引用x,用b去初始化引用y。x是变量a的引用,x和a在内存中有相同的存储单元;y是变量b的引用,y和b在内存中有相同的存储单元。
在rswap()函数中对形参x和y的值进行了交换。当mwap()函数执行完成后,x的值变成了5,y的值变成了3。因为x和a在内存中有相同的存储单元,y和b在内存中有相同的存储单元,所以实参a和b的值也改变了,变成5和3。
可以看到,在调用rawap()函数时,由于形参x和实参a有相同的存储单元,形参y和实参b有相同的存储单元,存储单元中存放的值在rawap0函数中通过形参x和y进行了交换,那么,实参a和b的值也进行了交换。因此,在引用调用中,当形参的值发生改变时,实参的值也会随之改变。
以上程序都在VC++6.0版本下完成。
3调用方式总结
传普通值调用和传地址值调用的实参、形参属于单向传递数据,即调用时实参的值传给形参,形参的值被改变后不会再传回实参。
引用调用的实参、形参属于双向传递数据,即调用时实参的值传给形参,形参的值被改变后会再传回实参。