byval关键字在传递实参中使用是啥意思?有啥作用
举例:
call SomeMethod(byval 0&)

解决方案 »

  1.   

    byval传值关键字;
    byref传地址关键字;
      

  2.   

    看看这里..
    http://paddy.myrice.com/program/234.htm
      

  3.   

    多谢3661512(.Net) 的帖子哪位能具体说一下在传实参的时候byval究竟是起什么作用?
      

  4.   

    byval传值关键字;
    byref传地址关键字;
      

  5.   


    byref传地址关键字;(默认)
    byval传值关键字;
      

  6.   

    byval传值关键字;
    一种将参数值而不是将地址传递给过程的方式,这就使过程访问到变量的复本。结果,过程不可改变变量的真正值。byref传地址关键字
    一种将参数地址而不是将值传递给过程的方式,这就使过程访问到实际的变量。结果,过程可改变变量的真正值。除非另作说明,否则按地址传递参数。
      

  7.   

    按值传递参数
    按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所作变动只影响副本而不会影响变量本身。用 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
      

  8.   

    其实上面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
      

  9.   

    多谢楼上各位指教,
    不过我想我还是想重点说明一下:我想知道的是在 “传实参”的时候byval起什么作用, 
                                               ~~~~也就是说,我在实际调用一个函数时加上byval关键字的时候,vb在背后做了什么?我猜测,是放
                 ~~~~~~~~~~~~~~~~~~~~弃了对空指针的检查,不过msdn上好像并没有说明这一点,让我很郁闷:(请大家继续不吝赐教,再拜
      

  10.   

    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&传递空指针。
      

  11.   

    比如你定义了下面这个过程
    Private Sub testByVal(ByVal intInput As Integer)
    intInput = intInput + 123
    End Sub
    然后进行调用
    a = 123
    Call testByVal(a)
    这时候做的事情是:将变量a的数值拷贝到另外一个内存空间中,然后在子过程中对那个新的
    内存空间的内容进行处理。处理过程中原来的变量a中的内存数据保持不变如果是byRef的那就是将变量a在内存中的地址告诉你的子过程,子过程直接操作变量a的内存空间,所以处理以后原来变量中a的数据与你子过程中对参数的处理结果是一样的。不知道这样说你是否明白了。看看我上面给你的例子吧,应该是很说明问题的了