众所周知,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.
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.
ByRef是传引用byval 传的是变量的副本
byval传的是变量本身
两者都是传参数值
(不知道你是否能看明白)
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
ByVal是传地址
ByRef是传引用
你这个说法和标准说法不一样唉,标准说法都是说 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"
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
而
写成 b = s2(byref c) 这种格式时就提示 缺少表达式?
参考byval vb 的特殊用法
这是VB中参数传递问题
参数传递分为按地址传递(byref)和按值传递(byval)
参数传递过程就是把你要运算的初始数值(实参)传递给运算的函数中的变量(形参)
这就好比数学中的解析几何:x=5,带入f(x)=x^2中一样
那么按地址传送就是把实参的地址告诉给形参,形参在实参的地址上进行运算,运算的结果改变了你给的初始实参数值。
按值传送,就是把实参的数值告诉形参,形参只是用你给的初始数值进行运算,运算的结果跟实参的初始数值无关。
上面就是二者最大也是最根本的区别。
你最好找本书,按书中例子实际操作一下,仔细揣摩会有收获。我也刚学,上面是我自己的理解。
ByRef只是和你说主席,可以是任何在主席位置上的人