C++语言中函数参数传递方式剖析

2007-08-25 01:30张瑞玲
智能计算机与应用 2007年4期
关键词:拷贝调用变量

谭 庆 张瑞玲

摘要:主要剖析了函数参数传递的各种方式,以及它们之间的区别。

关键词:函数参数传普通值调用传地址值调用

引用调用

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调用方式总结

传普通值调用和传地址值调用的实参、形参属于单向传递数据,即调用时实参的值传给形参,形参的值被改变后不会再传回实参。

引用调用的实参、形参属于双向传递数据,即调用时实参的值传给形参,形参的值被改变后会再传回实参。

猜你喜欢
拷贝调用变量
文化拷贝应该如何“拷”
基于Android Broadcast的短信安全监听系统的设计和实现
经济法律系统与ERP、财务管控系统的业务应用集成在电力行业中的应用
影子与我
分离变量法:常见的通性通法
利用RFC技术实现SAP系统接口通信
不可忽视变量的离散与连续
轻松把握变量之间的关系
变中抓“不变量”等7则
漫话拷贝