按值传递参数 按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所作变动只影响副本而不会影响变量本身。用 ByVal 关键字指出参数是按值来传递的。例如:Sub PostAccounts (ByVal intAcctNum as Integer) . . '这里放语句。 . End Sub按地址传递参数 按地址传递参数使过程用变量的内存地址去访问实际变量的内容。结果,将变量传递给过程时,通过过程可永远改变变量值。按地址传递参数在 Visual Basic 中是缺省的。如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。可以给参数传递一个表达式,而不是数据类型。Visual Basic 计算表达式,如果可能的话,还会按要求的类型将值传递给参数。把变量转换成表达式的最简单的方法就是把它放在括号内。例如,为了把声明为整数的变量传递给过程,该过程以字符串为参数,则可以用下面的语句:Sub CallingProcedure () Dim intX As Integer intX = 12 * 3 Foo (intX) End SubSub Foo (Bar As String) MsgBox Bar 'Bar 的值为字符串‘ 36 ’。 End Sub
其实上面msdn里面的例子也说的不是很清楚,我给你一个对比例子吧,一个窗体,一个按钮 年贴下面的代码Option ExplicitPrivate Sub Command1_Click() Dim a As Integer a = 123 Call testByVal(a) Debug.Print aCall testByRef(a) Debug.Print a End Sub Private Sub testByVal(ByVal intInput As Integer) intInput = intInput + 123 End Sub Private Sub testByRef(ByRef intInput As Integer) intInput = intInput + 123 End Sub
byval 0&是VB调用API时的一种特殊用法,表示传递一个空指针。这种用法在很多API函数都可以用到,举两个例子: 查找窗口的API函数:FindWindow(byval ClassName as string,byval Text as string) 其中第一个参数是窗体的类名,但很多情况下我们不知道窗体的类名,而是通过第二个参数也就是窗口标题来找,此时第一个参数就需要传递一个空指针,这时把函数声明为FindWindow(byval ClassName as any,byval Text as string),调用时:Findwindow(byval 0&,text)另外,很多API的参数是一个结构,而有时我们并不需要传递结构体进去,此时也可以将该结构参数改为byval para as any,调用时使用byval 0&传递空指针。
比如你定义了下面这个过程 Private Sub testByVal(ByVal intInput As Integer) intInput = intInput + 123 End Sub 然后进行调用 a = 123 Call testByVal(a) 这时候做的事情是:将变量a的数值拷贝到另外一个内存空间中,然后在子过程中对那个新的 内存空间的内容进行处理。处理过程中原来的变量a中的内存数据保持不变如果是byRef的那就是将变量a在内存中的地址告诉你的子过程,子过程直接操作变量a的内存空间,所以处理以后原来变量中a的数据与你子过程中对参数的处理结果是一样的。不知道这样说你是否明白了。看看我上面给你的例子吧,应该是很说明问题的了
byref传地址关键字;
http://paddy.myrice.com/program/234.htm
byref传地址关键字;
byref传地址关键字;(默认)
byval传值关键字;
一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。byref传地址关键字
一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。
按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所作变动只影响副本而不会影响变量本身。用 ByVal 关键字指出参数是按值来传递的。例如:Sub PostAccounts (ByVal intAcctNum as Integer)
.
. '这里放语句。
.
End Sub按地址传递参数
按地址传递参数使过程用变量的内存地址去访问实际变量的内容。结果,将变量传递给过程时,通过过程可永远改变变量值。按地址传递参数在 Visual Basic 中是缺省的。如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。可以给参数传递一个表达式,而不是数据类型。Visual Basic 计算表达式,如果可能的话,还会按要求的类型将值传递给参数。把变量转换成表达式的最简单的方法就是把它放在括号内。例如,为了把声明为整数的变量传递给过程,该过程以字符串为参数,则可以用下面的语句:Sub CallingProcedure ()
Dim intX As Integer
intX = 12 * 3
Foo (intX)
End SubSub Foo (Bar As String)
MsgBox Bar 'Bar 的值为字符串‘ 36 ’。
End Sub
年贴下面的代码Option ExplicitPrivate Sub Command1_Click()
Dim a As Integer
a = 123
Call testByVal(a)
Debug.Print aCall testByRef(a)
Debug.Print a
End Sub
Private Sub testByVal(ByVal intInput As Integer)
intInput = intInput + 123
End Sub
Private Sub testByRef(ByRef intInput As Integer)
intInput = intInput + 123
End Sub
不过我想我还是想重点说明一下:我想知道的是在 “传实参”的时候byval起什么作用,
~~~~也就是说,我在实际调用一个函数时加上byval关键字的时候,vb在背后做了什么?我猜测,是放
~~~~~~~~~~~~~~~~~~~~弃了对空指针的检查,不过msdn上好像并没有说明这一点,让我很郁闷:(请大家继续不吝赐教,再拜
查找窗口的API函数:FindWindow(byval ClassName as string,byval Text as string)
其中第一个参数是窗体的类名,但很多情况下我们不知道窗体的类名,而是通过第二个参数也就是窗口标题来找,此时第一个参数就需要传递一个空指针,这时把函数声明为FindWindow(byval ClassName as any,byval Text as string),调用时:Findwindow(byval 0&,text)另外,很多API的参数是一个结构,而有时我们并不需要传递结构体进去,此时也可以将该结构参数改为byval para as any,调用时使用byval 0&传递空指针。
Private Sub testByVal(ByVal intInput As Integer)
intInput = intInput + 123
End Sub
然后进行调用
a = 123
Call testByVal(a)
这时候做的事情是:将变量a的数值拷贝到另外一个内存空间中,然后在子过程中对那个新的
内存空间的内容进行处理。处理过程中原来的变量a中的内存数据保持不变如果是byRef的那就是将变量a在内存中的地址告诉你的子过程,子过程直接操作变量a的内存空间,所以处理以后原来变量中a的数据与你子过程中对参数的处理结果是一样的。不知道这样说你是否明白了。看看我上面给你的例子吧,应该是很说明问题的了