vb函数参数的传递

原创 2007年09月24日 17:29:00

实际上,形参的完整的语法格式应该为:

[[Optional][ByVal|ByRef]|ParamArray] <变量名> [()][As <类型>][=<缺省值>]

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

    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之间的异同点
-------------------------------------

首先,两种方式得到的结果毋庸置疑,肯定是一样的.

使用ByRef传参会改变量本身的值,而ByVal则不会,因为ByVal仅仅是将变量的副本传递到函数中.

那么使用这两种方式传参对代码的效率会有什么影响呢?我想,这是大部分程序员所关心的.

在 默认情况下,VB是按ByRef传递参数的,在一般情况下ByVal方式要比ByRef传递参数快,但当你要传递比较大的字符串或数组时,ByRef方式 就要比ByVal方式快,因为ByRef仅仅需要传递指向数据的四字节指针,而不是实际的数据.所以,在进行应用的时候,可以考虑实际情况进行处理,以便 达到最佳的运行速度.


题外话:

长整型变量(Long)是VB中最快的变量类型.
在做运算的时候,如果不是必须要保留小数,尽量避免使用浮点运算,因为整数运算不需要使用数字协处理器.
尽量避免使用对象的属性代替常量进行运算,针对于任何对象属性的访问都会影响运算的速度.
尽量使用动态数组,而避免使用静态数组,因为通过Erase方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存.

 

相关文章推荐

函数参数传递

  • 2014年02月28日 16:01
  • 294KB
  • 下载

C语言函数参数传递

  • 2013年07月14日 23:21
  • 26KB
  • 下载

VB Cells.find函数参数解释

用VBA录制的查找 Cells.Find(What:="想查找的数据", After:=ActiveCell, LookIn:=xlValues, LookAt:= xlPart, SearchOr...

函数参数的传递和值返回

  • 2012年03月20日 17:19
  • 40KB
  • 下载

C、C 函数参数传递方式

  • 2012年10月13日 22:50
  • 15KB
  • 下载

javascript判断函数参数是否传递[比较运算符中的两个等号与三个等号差别]

设有一函数: function msg(p1,p2,p3){   alert(p1);   alert(p2);   alert(p3); } 如何判断某个参数是否传递: //我们可以判...

函数参数三种传递方式的区别

问题提出:1、当一个类的对象作为实参数传递时,使用值传递和引用传递有什么区别? 比如: DateType ExampleFun(CString &strFileName,…)与 ...

函数参数的传递

  • 2008年03月24日 13:36
  • 39KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vb函数参数的传递
举报原因:
原因补充:

(最多只允许输入30个字)