过程(四)传地址和传值

2019-10-13 16:17:22 浏览数 (1)

上节介绍了过程的传递参数部分内容,即实参与形参的结合。

在VBA中实参可以通过两种方式将数据传递给形参,分别为传地址和传值,都是在创建通用过程定义变量时。

由于概念生硬不易理解,还是先说示例,再总结介绍。

一、 传 地 址

传地址是VBA默认的数据传递方式,在定义过程时,如果形参前面有关键字ByRef或者省略,则该参数通过传地址的方式传递。下面先看示例:

首先在模块中创建jisuan过程,ByRef a As Integer为按地址将实参传递给形参。

创建diaoyong过程,先定义了整型变量b,给b赋初始值为2。然后调用jisuan过程,将变量b作为实参按地址传递给变量a,进行计算a=a 1。此时再在立即窗口中显示变量b,就会发现它已经经过计算变成了3。

这是因为在调用过程时,将变量b做实参按地址传递给变量a,变量b和变量a指向同一个内存单元,一起变化。

注 意 点

1、前面说过sub过程通常不能返回运算结果的,如果需要返回值时,是可以利用ByRef方式来定义形参,这样就可以将子过程的运算数据返回调用程序中。

2、当形参定义为ByRef形式时,只有当实参为一个变量时,才能按地址方式传递参数,如果实参是一个表达式或者常量,则不能按传地址方式传递。

二、 传 值

传值是将实参的值作为一个副本,赋值给形参。定义过程中,在形参面前添加ByVal关键字,则该参数就按传值方式传递。

将上面示例中传地址的方式改成传值方式再运行一次,对比下结果。

在jisuan过程,ByVal a As Integer为按值将实参传递给形参。

在diaoyong过程,先定义了整型变量b,给b赋初始值为2。然后调用jisuan过程,将变量b作为实参按值给变量a,进行计算a=a 1。此时再在立即窗口中显示变量b,b的值仍为2。

所以使用传值方式传递参数时,传递的只是变量的副本,类似于一次赋值操作,改变只是在jisuan过程中,而再调用过程diaoyong中变量的值没有改变。

传地址与传值对比

两种方式,在程序中使用传地址方式比传值方式效率高,但是传地址方式中,有可能对程序产生不必要的影响。

为了在实际当中应用,一些原则可供参考:

1,形参如果是数组、自定义变量、对象变量,则只能用传址方式

2,形参前用了Byval,或者对应参数是常数、表达式,都是传值方式

3,形参前为Byref,或者没有关键词,都是传址方式。

4,实参为变量,且变量放在括号内,如“(a)”,则为传值。这种情况不多见

“传址”还是“传值”,该怎么选择呢?

1,如果希望通过过程调用,并修改对应实参的数值,用传址

例如:要实现两个变量值的交换,宜用传址

例如:要计算三个数的累加和额函数过程,在定义形参时,宜用传值。因为不希望在函数调用后,这三个参数值有什么改变

2,传址方式的速度快,但增加了过程的相互牵连;也不利于程序调试。而传值则相反

在实际中,可以先用传值方式,等调试后,再改为传址方式

3,用传址方式,要求实参与形参的数据类型完全一致


本节主要介绍过程的参数传递问题,重点是区分传地址和传值两种方式,结合示例去理解。(对于实参是数组的一类,后期介绍完数组的之后会补充。)

下一节将介绍可选参数和可变参数。祝大家学习快乐。


0 人点赞