Maison > Questions et réponses > le corps du texte
编程业余爱好者..
我也百度搜了,但是说的我也看不明白,都是专业属于...
别鄙视我,给我举个简单的例子呗.
PHPz2017-04-17 14:30:22
Sub Foo(ByVal p1, ByRef p2)
p1 = 9
p2 = 9
End Sub
Dim a As Integer
Dim b As Integer
a = 1 : b = 2
Foo(a, b)
' 此时 a 的值不变,仍为 1
' b 的值变为 9
这里“形参”就是p1
和p2
,“实参”就是a
和b
。
调用Foo
时,系统把a
复制了一份传给p1
,因此改变p1
的值不影响a
。而p2
代表对b
变量的引用,改变p2
也会让b
变化。
好久不写 VB 了,有错还请各位指正。
高洛峰2017-04-17 14:30:22
Sub Foo(ByVal p1, ByRef p2)
p1 + p2
End Sub
形参就是预设的可传入参数,Foo 声明了接受两个参数,p1 和 p2。这个时候实际上p1 和 p2只是理想状态,并不是实际参数,所以叫形参
Foo(1, 2)
调用Foo的时候传进去两个实际的,有意义的参数,1和2是实际参数,所以叫实参
迷茫2017-04-17 14:30:22
先弄明白形参和实参,形参是定义函数时括号里的参数,实参就是使用这个函数时实际上往里传入的参数。
再弄明白,变量是存在内存里的,每个变量会有属于自己的一块独立的内存空间,每个内存空间又有地址,通过地址能找到这块内存。
然后看这两个英文的意思,ByVal:按值传递,ByRef:按地址传递。
什么是按值传递呢?就是先给形参开辟一个新的内存空间,将实参的内容传入这个新的内存空间,这样传递后,形参与实参是在两个不同的内存空间中,也就是说他们是相互独立的,你在函数中怎么折腾这个形参,折腾的都是这个临时内存空间,和实参没关系,它静静的躺在自己的小屋里。
什么是按地址传递呢?就是直接将实参的内存空间地址传递给形参,这样,形参与实参就共用一块内存,所以,形参内容的改变也直接改变了实参的内容,你在函数中折腾形参,等同于折腾实参。
所以一般情况下,函数都会有个返回,因为函数默认都是按值传递,如果不返回,这个函数执行完,那些临时内存空间就释放了,执行半天啥也没了,当然,如果你定义了按地址传递,那就无需返回了。