实际上,形参的完整的语法格式应该为:
[[Optional][ByVal|ByRef]|ParamArray] <变量名> [()][As <类型>][=<缺省值>]
vb函数参数的传递ByVal表示该参数按值传递,简称值参。此时形参与实参各占一个***的存储空间,形参的存储空间是调用时才分配的。如果选择值参,则实参与过程体内的运算无关,它仍保留原值。因此,为了保护实参不受过程运算的影响,应选用数值参数。
ByRef表 示该参数按地址传递,称为变量参数,简称变参。此时形参与实参共同占用同一个存储空间,而实参的存储空间是调用前就分配了的。如果选择变参,则实参与过程 体内的运算有关,形参的改变会影响变参的值。因此,当被调过程需要向调用方传递两个及两个以上的值时,应选用地址传递。由于变参是VB默认的传值方式,所以在此之前,很多地方我们使用的都是变参。
需要说明的是:如果实参为常量,就是值参了
值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。
值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。 地址传递:传递地址,形参与实参用的是同一个地址,形参的变化会直接带给实参,属于 “双向传递”。此时,形参、实参一般是变量或数组。
Option Base 1
Private Sub Command1_Click()
Dim a(3) As Single, b(3) As Single, c(3) As Single
Dim x As Single, y As Single
Dim i As Integer
For i = 1 To 3
a(i) = Val(InputBox("请输入第" & i & "个方程的系数a:", "输入框"))
b(i) = Val(InputBox("请输入第" & i & "个方程的系数b:", "输入框"))
c(i) = Val(InputBox("请输入第" & i & "个方程的系数c:", "输入框"))
Call root(a(i), b(i), c(i), x, y)
Print "第"; i; "个方程"; a(i); "X^2+"; b(i); "X+"; c(i); "=0的根为:"
Next i
Print x, y
Call oneline
End Sub
Public Sub root(ByVal a As Single, _
ByVal b As Single, ByVal c As Single, _
x1 As Single, x2 As Single)//vb默认的是变参
Dim d As Single
Dim p As Single, q As Single
d = b * b - 4 * a * c
vb函数参数的传递 p = -b / 2 / a: q = Sqr(d) / 2 / a
x1 = p + q: x2 = p - q
End Sub
Public Sub oneline()
Dim k As Integer
For k = 1 To 40
Print "=";
Next k
Print
End Sub
说明:
⑴a、b、c、x1、x2为形参,a(i)、b(i)、c(i)、x、y为实参。
⑵其中a、b、c为值参,x1、x2为变参。
关于函数传参ByVal与ByRef之间的异同点
-------------------------------------
关于函数传参ByVal与ByRef之间的异同点
-------------------------------------
首先,两种方式得到的结果毋庸置疑,肯定是一样的.
使用ByRef传参会改变量本身的值,而ByVal则不会,因为ByVal仅仅是将变量的副本传递到函数中.
那么使用这两种方式传参对代码的效率会有什么影响呢?我想,这是大部分程序员所关心的.
在 默认情况下,VB是按ByRef传递参数的,在一般情况下ByVal方式要比ByRef传递参数快,但当你要传递比较大的字符串或数组时,ByRef方式 就要比ByVal方式快,因为ByRef仅仅需要传递指向数据的四字节指针,而不是实际的数据.所以,在进行应用的时候,可以考虑实际情况进行处理,以便 达到最佳的运行速度.
题外话:
长整型变量(Long)是VB中最快的变量类型.
在做运算的时候,如果不是必须要保留小数,尽量避免使用浮点运算,因为整数运算不需要使用数字协处理器.
尽量避免使用对象的属性代替常量进行运算,针对于任何对象属性的访问都会影响运算的速度.vb函数参数的传递
尽量使用动态数组,而避免使用静态数组,因为通过Erase方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存.
在做运算的时候,如果不是必须要保留小数,尽量避免使用浮点运算,因为整数运算不需要使用数字协处理器.
尽量避免使用对象的属性代替常量进行运算,针对于任何对象属性的访问都会影响运算的速度.vb函数参数的传递
尽量使用动态数组,而避免使用静态数组,因为通过Erase方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存.