vb中的值传递和地址传递到底有什么区别啊!?急
4个回答
展开全部
1 Private Sub Form_Load()
2 Dim x As Integer
3 x = 2
4 A x
5 Debug.Print x
6 End Sub
7 Sub A(ByRef t As Integer)
8 t = t - 1
9 End Sub
10 Sub B(ByVal t As Integer)
11 t = t - 1
12 End Sub
13 Sub C(t As Integer)
14 t = t - 1
15 End Sub
这是一个极为简单的Toy程序(呵呵,就是小玩具),不过他却体现了传值和传引用的巨大区别。
第7、10、13行分别是一个过程,这些过程都实现了同一功能,即将参数t的值减一。
在窗体的Load事件中,我们定义了一个变量x,然后调用第一个过程(A),注意到第7行中的参数列表中ByRef关键字,它代表传引用。
对于传引用,参数t 和 x其实就是一个变量。就像人有大名也可能有外号的道理一样。现在对于变量x,它的大名是x,外号是t。那么t-1其实就是x-1.最后打印出来的结果是x-1=1.
再看第10行,对于过程B,它的参数传递方式使用了ByVal关键字(即传值)
对于ByVal(传值),参数t和x根本就是不相关的两个变量。就如同两个人一样(以甲、乙为例),起初甲有两个苹果,然后甲告诉乙,你现在也有两个苹果了,于是乙乐呵呵的拿着两个苹果去过程B中,过程B的作用是将乙的苹果数减一,那么最后程序所要打印的是甲的苹果数,显然,苹果数2。根本没发生变化。那么有的朋友会问,这时乙的苹果数是1吧。答案是错的。对于变量,它是有生命周期的(在编程中叫做变量的作用域)。上面的代码中,变量x的有效期从Form_Load事件激活开始,到End Sub(也就是这个事件结束时)为止。而变量t的有效期从过程的第一句开始,到End Sub为止。一旦超过这个有效期,变量的值就不复存在了。所以,如果想要打印出乙的苹果数,只能在使用该变量的过程中打印,超出这个过程对该变量的任何操作都是毫无意义的。
自己搜的一个,另外,在msdn帮助中也有相关的说明。学习vb等微软的变成时,安装上msdn,很有帮助。
2 Dim x As Integer
3 x = 2
4 A x
5 Debug.Print x
6 End Sub
7 Sub A(ByRef t As Integer)
8 t = t - 1
9 End Sub
10 Sub B(ByVal t As Integer)
11 t = t - 1
12 End Sub
13 Sub C(t As Integer)
14 t = t - 1
15 End Sub
这是一个极为简单的Toy程序(呵呵,就是小玩具),不过他却体现了传值和传引用的巨大区别。
第7、10、13行分别是一个过程,这些过程都实现了同一功能,即将参数t的值减一。
在窗体的Load事件中,我们定义了一个变量x,然后调用第一个过程(A),注意到第7行中的参数列表中ByRef关键字,它代表传引用。
对于传引用,参数t 和 x其实就是一个变量。就像人有大名也可能有外号的道理一样。现在对于变量x,它的大名是x,外号是t。那么t-1其实就是x-1.最后打印出来的结果是x-1=1.
再看第10行,对于过程B,它的参数传递方式使用了ByVal关键字(即传值)
对于ByVal(传值),参数t和x根本就是不相关的两个变量。就如同两个人一样(以甲、乙为例),起初甲有两个苹果,然后甲告诉乙,你现在也有两个苹果了,于是乙乐呵呵的拿着两个苹果去过程B中,过程B的作用是将乙的苹果数减一,那么最后程序所要打印的是甲的苹果数,显然,苹果数2。根本没发生变化。那么有的朋友会问,这时乙的苹果数是1吧。答案是错的。对于变量,它是有生命周期的(在编程中叫做变量的作用域)。上面的代码中,变量x的有效期从Form_Load事件激活开始,到End Sub(也就是这个事件结束时)为止。而变量t的有效期从过程的第一句开始,到End Sub为止。一旦超过这个有效期,变量的值就不复存在了。所以,如果想要打印出乙的苹果数,只能在使用该变量的过程中打印,超出这个过程对该变量的任何操作都是毫无意义的。
自己搜的一个,另外,在msdn帮助中也有相关的说明。学习vb等微软的变成时,安装上msdn,很有帮助。
参考资料: http://zhidao.baidu.com/question/122514519.html
展开全部
值传递:是把实参的值赋给形参。形参的变化不会影响实参,数据传递是单向的。
地址传递:是把实参的地址传递给形参,形参变化实参也跟着变化,数据传递是双向的。
地址传递:是把实参的地址传递给形参,形参变化实参也跟着变化,数据传递是双向的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Private Sub Command1_Click()
Dim x%, y%
x = 3: y = 4
X1 = kb(x, y) '把值传过去,那边修改对这里不影响
Print X1 & "_ " & x & "_" & y 'x=3: y=4
X2 = kc(x, y) '把地址给x,y传过去, 被那边修改了
Print X2 & "_" & x & "_" & y 'x=5,y=6
End Sub
'----------------------------------------------
Public Function kb(ByVal a As Integer, ByVal b As Integer) As Long '按值传递
a = 5
b = 6
kb = a + b
End Function
'---------------------------------------
Public Function kc(ByRef a As Integer, ByRef b As Integer) As Long '安地址传递
a = 5
b = 6
kc = a + b
End Function
Dim x%, y%
x = 3: y = 4
X1 = kb(x, y) '把值传过去,那边修改对这里不影响
Print X1 & "_ " & x & "_" & y 'x=3: y=4
X2 = kc(x, y) '把地址给x,y传过去, 被那边修改了
Print X2 & "_" & x & "_" & y 'x=5,y=6
End Sub
'----------------------------------------------
Public Function kb(ByVal a As Integer, ByVal b As Integer) As Long '按值传递
a = 5
b = 6
kb = a + b
End Function
'---------------------------------------
Public Function kc(ByRef a As Integer, ByRef b As Integer) As Long '安地址传递
a = 5
b = 6
kc = a + b
End Function
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
按值不改变带入参数本身的值,只是带入参数的一个复制参与运算
按地址传递会改变带入参数本身的值
Dim x1 As Integer
Dim y1 As Integer
Private Function ADD_ByVal(ByVal x As Integer, ByVal y As Integer) As Integer '按值传递
x = x + 1
y = y + 1
ADD_ByVal = x + y
End Function
Private Function ADD_ByRef(ByRef x As Integer, ByRef y As Integer) As Integer '按地址传递
x = x + 1
y = y + 1
ByRef= x + y
End Function
如果你把上面的x1,y1带入ADD_ByVal函数运算,运算后x1,y1的值不发生任何变化,依然等于0
如果你把上面的x1,y1带入ADD_ByRef函数运算,运算后x1,y1的值发生了变化,x1=1,y1=1了
按地址传递会改变带入参数本身的值
Dim x1 As Integer
Dim y1 As Integer
Private Function ADD_ByVal(ByVal x As Integer, ByVal y As Integer) As Integer '按值传递
x = x + 1
y = y + 1
ADD_ByVal = x + y
End Function
Private Function ADD_ByRef(ByRef x As Integer, ByRef y As Integer) As Integer '按地址传递
x = x + 1
y = y + 1
ByRef= x + y
End Function
如果你把上面的x1,y1带入ADD_ByVal函数运算,运算后x1,y1的值不发生任何变化,依然等于0
如果你把上面的x1,y1带入ADD_ByRef函数运算,运算后x1,y1的值发生了变化,x1=1,y1=1了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询