7.4.7 参数传递
7.4.7 参数传递
过程的参数分实参与形参两种形式,过程定义时的参数为形参(形式参数),调用过程时的参数为实参(实际参数),形参只能是变量或者数组,实参可以是变量、常量、数组、表达式等。过程调用时,程序首先将实参的值依次传递给对应位置的形参,然后程序流程转到过程内部,过程调用结束,程序流程又会返回到调用过程,执行调用过程语句后面一条语句。实参与形参的参数传递,首先要保证实参与形参的个数一致,其次要保证实参与相对应的形参数据类型一致。
VBA中,实参与形参的结合有两种形式:地址传递,值传递。需要注意的是,只有当实参为变量或数组时,才有这两种形式。实参如果为常量、表达式,则实参与形参只能进行值传递。
1.地址传递
所谓地址传递就是实参将其内存的地址传递给形参,这样形参内存地址就和实参保持一致,即实参与形参共用相同的内存单元。因此,形参如果在子过程中发生改变,返回调用过程后,实参值也发生改变。在前面子过程调用的例子中,a、b为实参,x、y为形参,x、y定义时,如果前缀省略,或前缀为ByRef,即(x As Integer, y As Integer)和(ByRef x As Integer,ByRef y As Integer)都表明形参x、y按地址传递方式实现实参a、b与形参x、y的传递。因为是地址传递,所以test过程运行结束后,实现了x、y值的交换。
2.值传递
所谓值传递是指实参只是将其值传递给形参,实参与形式分别有各自独立的内存单元,形参值在子过程中发生改变并不影响实参的值。形参前加ByVal前缀,就是定义实参与形参进行值传递。前面test过程形参x、y如果改成值传递,则运行结果将会不同。例如:对前面test过程修改如下。
本test过程,只是将实参变量a、b的值2、3传递给x、y。如通过以下程序段调用该过程:
程序运行后调用test过程,最终输出结果还是2和3,实参a、b并没有发生改变。