众所周知,byval是传值,byref是传址,为什么代码如下:Private Function s1(ByVal dd1 As Long) As Long
   Dim mm1 As Long
   mm1 = dd1
End FunctionPrivate Function s2(Byref dd2 As Long) As Long
   Dim mm2 As Long
   mm2 = dd2
End FunctionPrivate Sub Command1_Click()
  dim a as long ,b as long ,c as long
  c=1234
  a=s1(c)
  b=s2(c)
End Sub为什么s1和s2执行过程中,两个参数dd1和dd2得到的值均为1234,ByVal dd1 As Long,dd1的值为1234,是对的,但ByRef dd2 As Long ,dd2应该得到c的地址呀,为什么dd2的值也是1234.

解决方案 »

  1.   

    ByVal是传地址
    ByRef是传引用byval 传的是变量的副本
    byval传的是变量本身
      

  2.   

    byval是值传递,byref是地址传递.
    两者都是传参数值
      

  3.   

    不是你那么理解的,应该这样理解
    (不知道你是否能看明白)
    Private Function s1(ByVal dd1 As Long) As Long
      s1 = dd1
      dd1 = dd1 + 1
    End FunctionPrivate Function s2(ByRef dd2 As Long) As Long
      s2 = dd2
      dd2 = dd2 + 1
    End FunctionPrivate Sub Command1_Click()
      Dim a As Long, b As Long, c As Long
      c = 1234
      a = s1(c)
      Debug.Print a
      Debug.Print c  '传值原数据没有改变
      b = s2(c)
      Debug.Print b
      Debug.Print c  '传址原数据改变了1235
      
    End Sub
      

  4.   


    ByVal是传地址
    ByRef是传引用
    你这个说法和标准说法不一样唉,标准说法都是说   byval是按值传递,byref是按地址传递.
    到底是谁对。
      

  5.   

    byval    按值传递    只是把数值传递给函数byref    按地址传递   把这个变量的地址传给了函数,可以在函数里修改这个变量
      

  6.   

    啥叫"标准说法".  简单点理解吧, 按值就是送一个值给调用的过程,仅供调用;按地址就是调用的过程取该参数变量的地址,至于该过程是否改变了此地址中参数的值,要看该过程本身. 你的s2就没有改变它,4F的s2改变了它
      

  7.   

    参考关于ByVal和ByRef关键字的问题!
      

  8.   

    这个说法是对的。
    所谓的按地址传递,就是传递过去的只是一个32位的数字,这个数字是一个内存句柄,这块内存句柄里指向的内存空间中存放了你要传递过去的内容(也就是传递的值)。在VC中相当于传递过去的是一个指针。而按值传递,就是你提供一个内存句柄,VB将他变量内的内容(也就是值)复制一份到你的内存句柄中。
    在VB中通常是普通的变量值。
      
    比如:int uu(DWORD a,char * b){
       printf("变量a:%d  \r\n变量b:%s",a,b);
    }如过从VB传递,a需要按值传递,b需要按地址传递   Declare function uu(ByVal a As long,ByRef b As String) As Integer
       '......
       uu 1000,"ABCEFG"
      

  9.   

    看看下面这个程序有什么意思:Option ExplicitPrivate Function s1(ByVal dd1 As Long) As Long
      s1 = dd1 * 2
    End FunctionPrivate Function s2(ByRef dd2 As Long) As Long
      dd2 = 100 * 4
      Debug.Print VarPtr(dd2)
    End FunctionPrivate Sub Form_Load()
       Dim retValue As Long
       
       retValue = s1(100)
       Debug.Print retValue '结果为200
       
       Call s2(retValue)
       Debug.Print VarPtr(retValue), retValue '结果为400
       
    End Sub
      

  10.   

    为什么写成b = s2(byval c)这种格式 可以

    写成 b = s2(byref  c) 这种格式时就提示 缺少表达式?
      

  11.   


    参考byval vb 的特殊用法
      

  12.   

    不管提不提示,你能运行吗?估计是ide的一个小bug
      

  13.   

    这个你找本书简单一看就明白了
        这是VB中参数传递问题
        参数传递分为按地址传递(byref)和按值传递(byval)
        参数传递过程就是把你要运算的初始数值(实参)传递给运算的函数中的变量(形参)
        这就好比数学中的解析几何:x=5,带入f(x)=x^2中一样
        那么按地址传送就是把实参的地址告诉给形参,形参在实参的地址上进行运算,运算的结果改变了你给的初始实参数值。
        按值传送,就是把实参的数值告诉形参,形参只是用你给的初始数值进行运算,运算的结果跟实参的初始数值无关。
        上面就是二者最大也是最根本的区别。
    你最好找本书,按书中例子实际操作一下,仔细揣摩会有收获。我也刚学,上面是我自己的理解。
      

  14.   

    ByVal就相当于告诉你XXX是主席,具体到人
    ByRef只是和你说主席,可以是任何在主席位置上的人