对于初学者来说,参数传递是个难点。传递参数的方式有以下两种。
1.按值传递
如果调用过程中的实参是常量或表达式,或定义过程时形参选用ByVal关键字,那么这种传递方式称为按值传递。
【例7-2】编写函数,计算两个数中的最大值。
按“三步法”原则分析如下。
做什么
1)从函数调用者获取两个数据,也就是函数体要从函数体外获取两个数据,所以需要定义两个形式参数。
2)函数体功能:获得两个数据后,比较两个数的大小。
3)把较大者反馈给调用者,也就是把较大者从函数体内传输到函数体外,所以函数需要返回值。而作为函数,名称可以返回一个数据,这是函数优越于过程的地方。
4)函数定义完成后,要验证其正确性,所以应该有一个过程调用该函数。在学习阶段,这个过程一般采用事件过程,例如,按钮的Click事件过程。而传递给函数的两个数据也应该是可变的,也就是由用户输入的,所以在按钮的Click事件过程中应该有获取用户数据的语句。
怎么做
略。
实现
完整代码如下。
运行结果如图7-5所示。
图7-5 两个数的最大值
可以看出,如果形参采用ByVal,即按值传递方式,则实参变量可以不定义,也可以作为变体类型。调用时,系统把a的值传递给x,把b的值传递给y。
【例7-3】用过程实现交换两个变量的值。
按“三步法”原则分析如下。
做什么
1)从过程调用者获取两个数据,也就是过程体要从过程体外获取两个数据,所以需要定义两个形式参数。
2)过程功能:获得两个数据后,交换这两个变量中的值。
3)除了交换给定的两个变量中的值外,没有别的返回信息,所以可以不用定义额外返回值,用过程实现。
4)在按钮的Click事件过程中应该有获取用户数据的语句。
怎么做
略。
实现
完整代码如下。
用户输入a=55,b=66,结果如图7-6所示。
(www.xing528.com)
图7-6 交换变量值1
由此可以看出,a,b的值并没有交换。
那么过程体内的x,y是不是没有交换呢?为了验证这一设想,修改过程代码如下。
代码修改后的运行结果如图7-7所示。
图7-7 交换变量值2
由此可以看出,在过程exchange中,x接收了a的值55,y接收了b的值66,并且对x、y进行了交换,交换后x值变为66,y值变为55。但是x,y值的变化并未影响a,b的值,这正是按值传递的特点。在按值传递过程中,数据传递是单向的。数据只能从实参传递给形参,而不能由形参传递给实参。也就是说,在过程体内,无论形参的值如何变化,它都不会影响与之对应的实参的值。那么该如何实现实参的变化呢?这就需要按地址传递。
2.按地址传递
如果定义过程时形参选用ByRef关键字,或者省略模式,就可以按地址传递。
修改例7-3代码如下:
运行结果如图7-8所示。
图7-8 按地址传递
由此可以看出,按地址传递是双向的,数据既可以由实参传递给形参,也可以由形参传递给实参。在过程体内,如果对形参进行了修改,则会影响与之对应的实参。利用这一特点可以获得过程或函数的返回值。例如,当过程或函数有多个返回值时,就可以利用这一特点,因为函数名称无法返回多个值。所以,当有多个返回值时,一般用引用参数实现。
定义形参时,如果省略了ByVal和ByRef,即为省略模式,则默认为按地址传递,格式如下:
说明:
1)如果形参采用按地址传递方式,则要求实参变量必须定义,并且应定义为与形参完全相同的数据类型。如果缺少实参变量的定义,系统会弹出如图7-9所示的提示框。
例如,在Command1_Click事件过程代码中缺少如下定义语句,系统就会报错。
图7-9 实参变量未定义
2)如果把过程和函数比作一个房子,则形参是房子内使用的变量,实参是房子外使用的变量。
3)按值传递属于单向传递,数据只是从实参传递给形参,传递完毕后,二者就失去联系,无论在过程体或函数体中如何修改形参的值,也不会影响外面的实参。
4)按地址传递属于双向传递。运行时,实参与形参按位置相对应,实参把自己在内存中的地址告诉形参,那么实参和形参就成为指向同一个存储空间的两个变量。就像一个人有两个名字一样,例如,“李明”“明明”都指的是一个人。如果明明得到一个苹果,那么李明也将得到一个苹果。如果把明明的苹果换为马铃薯,则李明的苹果也会被换为马铃薯。由此看来,按地址传递方式,能够把过程体中的数据传递到过程体或函数体外,可以采用按地址传递获取过程或函数的返回值。
那么,什么时候采用函数,什么时候采用过程呢?一般,过程和函数是可以相互替换的,但是有时要根据不同情况来决定使用哪个更方便。
一般书写原则:
一定要弄清楚有几个数据需要传入过程或函数体内,有几个数据要从过程或函数体内传出。当只有一个返回值时,用函数较为方便。形参的个数就是要传入数据的个数,有几个需要传入的数据就定义几个形参。
当有两个或两个以上返回值时,一般采用过程。所有传入、传出都通过参数实现。形参的个数一般可以简单计算为传入、传出数据的总个数,把传入数据的形参定义为按值传递,传出形参定义为按地址传递。有时也可以用同一个形参既实现传入,又实现传出,这时要把这个形参定义为按地址传递。
在过程和函数体内一般不写输入、输出语句,这样可以增加过程和函数的通用性。过程和函数只是完成指定功能,把返回值传递给调用者,至于怎么处理由调用者来决定。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。