为什么下面的程序结果a = 9 ?不是地址传递吗?Private Sub Command1_Click()
Dim a As Integer
a = 9
test (a)
Debug.Print "a=" + CStr(a)
End SubPublic Function test(ByRef a) 
a = 0
End Function

解决方案 »

  1.   

    按地址传递.相当于C中传递一个指针,共同指向一个相的内存地址,当改变参数值时,其内容也跟着改变.
     
      FUNCTION MYFUN(BYREF K AS STRING)
               K=="ABCDEFG"
      END FUNCTION
       
      SUB TT()
          DIM A AS STRING
          A="123456'
          CALL MYFUN(A)
          MSGBOX A  '些时,A的内容是ABCDEFG
      END SUB
      

  2.   

    这边还有一个:  按地址传递参数,使过程用变量的内存地址去访问实际变量的内容。因此,将变量传递给过程时,通过过程可永远改变变量值。按地址传递参数在VB中是缺省的。
      如果给按地址传递的参数指定数据类型,就必须将这种类型的值传递给参数。可以给参数传递一个表达式,而不是数据类型。VB计算表达式,如果可能的话,还会按要求的类型将值传递给参数。
      把变量转换成表达式的最简单的方法就是把它放在括号内。例如,为了把声明为整数的变量传递给过程,该过程以字符串为参数,则可以用下面的语句:
      Sub CallingProcedure()
      Dim intX As Integer
      intX = 12 * 3
      Foo(intX)
      End Sub
      Sub Foo(Bar As String)
      MsgBox Bar ‘Bar的值为字符串′36′
      End Sub应该可以懂了吧,你那段代码就是把 a=9 的地址传给test过程~~所以结果就是 a=9
      

  3.   

    你前面的我都懂了,不过最后一句没懂。传地址的话,a的值在test函数中被改变了,结果不应该是0吗?还有你举的第一个例子,倒数第三行是CALL MYFUN(A)
    如果把CALL去掉改成:MYFUN(A)
    那么结果就不是ABCDEFG,而是123456了。你举的例子我明白,但我不明白去掉CALL之后为什么结果就变了。
    我想问的就是这个问题。
      

  4.   

    CrazyDogHH3(浪漫如枫)已经说得比较清楚了
    test (a)

    test a
    会得到不同的两种结果,主要是传入的内容不一样
      

  5.   

    ……………………好像是哦………………HOHO,我是初学者,这个问题也是弄了好久,最后不了了之了~~现在说说我自己的理解吧,用CALL,就是调用这个过程,那自然而然的就是连里面的形参地址也一起调用了,然后传递给实参;而如果不用CALL,就是把这个实参的地址赋给了形参~~应该有个主动和被动的关系……呵呵,这只是我个人的见解,也不知道对不对~~还是听听各位高手的吧~~~~~
      

  6.   

    这个和实参和形参无关,如果是 test (a) 调用,则传入的是a的表达式,也就是“a=9”,而不是a变量的地址。
      

  7.   

    懂了~~~~~ 那test a 就是传入a 变量地址了?~谢谢版主~~随便祝贺一下荣升版主~~~~
      

  8.   

    谢谢2位,不过我还是有点不太明白。您的意思是不是说
    test(a)是传入表达式,而不是传入地址?那么我试了一下,把test(a)改为 b = test(a)
    结果就不是9,而是0了。
    这次怎么又传地址了?
      

  9.   

    楼上再试试这个:
    b=test((a))
    然后再看看a的值就知道了。多谢 CrazyDogHH3(浪漫如枫) ,有时间常来com版捧场喔 :)
      

  10.   

    这个问题是这样的:
    函数调用只有下面这两种形式:
    1)call test(a)
    2) test a所以,当写成test(a)的时候,系统会匹配第2种方式,
    即把(a)看成一个元素,所以不是传递地址。再举个例子:
    如果写成test (a,b)
    同样由于系统会把(a,b)看成一个参数,但这个参数不
    能被解析,所以编译会报错。
      

  11.   

    I got it !
    Thank you all! ^_^
      

  12.   

    TO sinom(毛毛.小狮子>>苦学ORACLE) HOHO,我还是初学者呢,哪里懂什么COM~~~