当前位置:编程学习 > VB >>

byval和byref的问题

众所周知,byval是传值,byref是传址,为什么

代码如下:

Private Function s1(ByVal dd1 As Long) As Long
   Dim mm1 As Long
   mm1 = dd1
End Function

Private Function s2(Byref dd2 As Long) As Long
   Dim mm2 As Long
   mm2 = dd2
End Function

Private 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.

--------------------编程问答-------------------- ByVal是传地址
ByRef是传引用

byval 传的是变量的副本
byval传的是变量本身 --------------------编程问答-------------------- byval是按值传递,byref是按地址传递.
两者都是传参数值 --------------------编程问答-------------------- 参数传递方式不同,但是值还是一样。
比如你坐火车到某地跟坐汽车到某地,结果都还是某地。 --------------------编程问答-------------------- 不是你那么理解的,应该这样理解
(不知道你是否能看明白
Private Function s1(ByVal dd1 As Long) As Long
  s1 = dd1
  dd1 = dd1 + 1
End Function

Private Function s2(ByRef dd2 As Long) As Long
  s2 = dd2
  dd2 = dd2 + 1
End Function

Private 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
--------------------编程问答--------------------
引用 1 楼 veron_04 的回复:
ByVal是传地址
ByRef是传引用

byval 传的是变量的副本
byval传的是变量本身


ByVal是传地址
ByRef是传引用
你这个说法和标准说法不一样唉,标准说法都是说   byval是按值传递,byref是按地址传递.
到底是谁对。 --------------------编程问答-------------------- byval    按值传递    只是把数值传递给函数

byref    按地址传递   把这个变量的地址传给了函数,可以在函数里修改这个变量 --------------------编程问答--------------------
引用 5 楼 edeshe 的回复:
引用 1 楼 veron_04 的回复:
ByVal是传地址
ByRef是传引用

byval 传的是变量的副本
byval传的是变量本身


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

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

关于ByVal和ByRef关键字的问题! --------------------编程问答--------------------
引用 2 楼 king06 的回复:
byval是按值传递,byref是按地址传递.
两者都是传参数值

这个说法是对的。
所谓的按地址传递,就是传递过去的只是一个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"
--------------------编程问答-------------------- 看看下面这个程序有什么意思:

Option Explicit

Private Function s1(ByVal dd1 As Long) As Long
  s1 = dd1 * 2
End Function

Private Function s2(ByRef dd2 As Long) As Long
  dd2 = 100 * 4
  Debug.Print VarPtr(dd2)
End Function

Private 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
--------------------编程问答-------------------- s2徒有虚名,没用到返回值,只用到变量地址! --------------------编程问答-------------------- 为什么

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

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





--------------------编程问答--------------------
引用 12 楼 edeshe 的回复:
为什么

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

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


参考

byval vb 的特殊用法 --------------------编程问答--------------------
引用 12 楼 edeshe 的回复:
为什么

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

写成 b = s2(byref c) 这种格式时就提示 缺少表达式?
不管提不提示,你能运行吗?估计是ide的一个小bug --------------------编程问答-------------------- 我们这儿没有研究生吗 --------------------编程问答-------------------- 这个你找本书简单一看就明白了
    这是VB中参数传递问题
    参数传递分为按地址传递(byref)和按值传递(byval)
    参数传递过程就是把你要运算的初始数值(实参)传递给运算的函数中的变量(形参)
    这就好比数学中的解析几何:x=5,带入f(x)=x^2中一样
    那么按地址传送就是把实参的地址告诉给形参,形参在实参的地址上进行运算,运算的结果改变了你给的初始实参数值。
    按值传送,就是把实参的数值告诉形参,形参只是用你给的初始数值进行运算,运算的结果跟实参的初始数值无关。
    上面就是二者最大也是最根本的区别。
你最好找本书,按书中例子实际操作一下,仔细揣摩会有收获。我也刚学,上面是我自己的理解。 --------------------编程问答-------------------- 额,我忘了一点,这可能对你的疑问有所解答
按地址传递时,运算结果改变实参的初始数值,改变后的数值与形参数值相同
楼主还是找个小例子揣摩一下吧 --------------------编程问答-------------------- ByVal就相当于告诉你XXX是主席,具体到人
ByRef只是和你说主席,可以是任何在主席位置上的人
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,