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方法可以清空动态数组中不需要的元素并释放出占用的内存,而对于静态数组,只能将数组中元素的内容清空,并不会释放数组元素所使用的内存.

 

VB几种函数参数传递方法,Variant,数组,Optional,ParamArray

VB几种函数参数传递方法,Variant,数组,Optional,ParamArray  一) 过程的参数被缺省为具有 Variant 数据类型。   1)ByRef按  地址传递参数在 VB 中...
  • whchensir
  • whchensir
  • 2016年07月28日 00:33
  • 3733

在VB中调用C/C++语言编写的dll,数组参数的传递

动态链接库(dll)的好处就不多说了,这里就把如何在VB中调用VC写的dll函数的方法介绍一下,供有需要的朋友们参考,同时也免得自己以后忘了。 初次接触DLL的用户经常会遇到一个问题:在VC环境...
  • shejiannan
  • shejiannan
  • 2014年05月19日 16:20
  • 1185

值传递和引用传递-----函数参数传递的两种方式

回顾:          在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。 注意...
  • u014041012
  • u014041012
  • 2015年04月06日 14:22
  • 3087

函数参数传递

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

C语言函数参数传递

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

函数参数的传递和值返回

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

C、C 函数参数传递方式

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

C/C++中多维数组指针作为函数参数传递程序

  • 2009年04月22日 17:38
  • 26KB
  • 下载

函数参数的传递问题(一级指针和二级指针)

  • 2010年04月13日 14:47
  • 41KB
  • 下载

函数参数的传递

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

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