加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB过程(函数)之间的参数传递

(2010-09-12 22:29:17)
标签:

杂谈

分类: QTP/VBS20100524

一、             形式参数与实际参数

1 形式参数:就是在定义函数或过程的时候命名的参数。通俗讲就是一个记号。

2 实际参数:就是在执行时,调用函数或过程时,传递给函数或过程的参数。通俗讲就是实际值。

3 参数嘛,就是一个可变量,它随着使用者的不同而发生变化。举个例子,在中学的时候学过sin(x)函数,这里的x就是形式参数,当你需要求1的正弦值时,你会使用sin(1),这里的1就是实际参数。

4 形参和实参间的关系:两者是在调用的时候进行结合的,通常实参会将取值传递给形参,形参去之后进行函数过程运算,然后可能将某些值经过参数或函数符号返回给调用者。

在过程之间传递参数,形式参数和实际参数是很重要的概念。我们通常说形式参数是过程为了运行的需要预先在内存中保留的地址单元,而实际参数就是在调用过程时放入这些内存地址中进行处理的数据。如果形式参数是一个盒子,那么实际参数就是盒子里面装的东西。在参数传递的过程中,形式参数和实际参数的数据类型要一致。

二、             参数传递

函数参数的传递方式有两种,一种是按地址传递,一种是按值传递。

按地址传递:调用函数时,不直接把实参的值告诉函数,而是把地址告诉它,函数根据这个地址来寻找并处理值,如果函数修改了这个值,也就修改了这个地址对应的值。

按值传递:把值复制一份再给函数,这个值只属于函数,函数对这个值的修改不影响原值。

VBScript 中,要按地址传递可在形参前加 ByRef,要按值传递得在形参前加 ByVal,如果什么也不加则表示按地址传递。

1)        按值传递

如果在声明过程时,形式参数名前面加上关键字“ByVal”,即规定了在调用此过程时该参数是按值传递的。按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所做的改动只影响副本而不会影响变量本身。

 

代码1

**********************************

Private Sub Command1_Click()

    Dim num1 As Integer

    num1 = 5

    Print num1

    Call MySub(num1)

Print num1    ' 输出结果为5

 

    Call MySub2(num1)

Print num1    ' 输出结果仍为5

End Sub

 

Private Sub MySub(ByVal A As Integer)

    A = 10

End Sub

 

Private Sub MySub2(ByVal A As String)

    A = "abc"

End Sub

**********************************

如果过程中的形式参数设定为按值传递,就不要求调用时相应实参数的类型必须与其一致,只要实参数的值能够转换为形参的类型即可。

代码2

**********************************

Private Sub Command1_Click()

    Dim num1 As Integer

    num1 = 5

    Print num1

 

    Call MySub2(num1)

Print num1    ' 输出结果仍为5

End Sub

 

 

Private Sub MySub2(ByVal A As String)

    A = "abc"

End Sub

**********************************

 

 

2)        按地址传递参数

按地址传递参数时,过程用变量的内存地址去访问实际变量的内容,将结果的变量传递给过程时,通用过程可永远改变该变量值。ByRef Visual Basic 的缺省选项。

如果指定按地址传递参数的数据类型,就必须将这种类型的值传给参数,即如果过程中的形式参数设定为按地址传递,就必须要求调用时相应实参数的类型必须与其一致。

按地址传递参数时,传递给所调用过程的形参实际是实参的地址。如果过程改变了这个值,则所做的变动也会影响实参变量本身。

 

代码3

******************************************

Private Sub Command1_Click()

  

    Dim num1 As Integer

    num1 = 5

    Print num1

   

    Call MySubByRef(num1)

    Print num1   ' 输出结果为10

   

     Call MySubByRef2(num1)

    Print num1  ' 默认情况,输出结果仍为10

   

End Sub

 

 

Private Sub MySubByRef(ByRef A As Integer)

    A = 10

End Sub

 

Private Sub MySubByRef2(A As Integer)

    A = 10

End Sub

******************************************

3)        二者比较

ByVal 传送参数内存的一个拷贝给被调用者。也就是说,栈中压入的直接就是所传的值。
ByRef
传送参数内存的实际地址给被调用者。也就是说,栈中压入的是实际内容的地址。被调用者可以直接更改该地址中的内容。

ByVal
可选的。表示该参数按值传递。
ByRef
表示该参数按地址传递。 ByRef Visual Basic 的缺省选项。

ByVal
是传递值,源数据不会被修改。你可以把这个值当作自己的局部变量来使用
ByRef
是传递地址,源数据可能被修改。你对这个变量的操作将对你传入的那个变量产生影响,就像指针的感觉。

 

4)        参数传递中的特殊情况

下面演示了实参变量通过加上一个额外的小括号来强制其以单个变量为实参进行按值传递,在这里默认的byRef已经失效。

代码4

******************************************

Private Sub Command1_Click()

  

    Dim num1 As Integer

    num1 = 5

    Print num1

           

    Call MySubByRef2 ((num1))

    Print num1

    

End Sub

 

Private Sub MySubByRef2 (A As Integer)

    A = 10

End Sub

******************************************************

5)        几点说明

  

A.       实际上,如果在过程中不改变形参的值,无论是按值还是按地址传递,结果都是一样的。

B.        对于一般过程来讲,参数的主要目的是设定一个条件,所以形参往往只是用来参与计算或给其他变量赋值,其本身的值不会发生改变。

C.        在过程中,对按值传递形参变量的值改变不会导致对应实参变量的改变,而按地址传递形参变量的值的改变通常会导致对应的实参变量的改变

D.       当变量声明修饰符为Byref,如果参数是一个常量或者表达式,尽管形参声明按地址传递,实际上还是按值传递。参考代码4

E.        按地址传递时,形参与实参公用一个内存地址,所以实参与形参的数据类型必须相同,否则会出现“类型不匹配”的错误

 

附图:

http://s16/middle/62b8fc33t9010da902f3f&690


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有