编程业余爱好者..
我也百度搜了,但是说的我也看不明白,都是专业属于...
别鄙视我,给我举个简单的例子呗.
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:按地址傳遞。
什麼是按值傳遞呢?就是先給形參開闢一個新的記憶體空間,將實參的內容傳入這個新的記憶體空間,這樣傳遞後,形參與實參是在兩個不同的記憶體空間中,也就是說他們是相互獨立的,你在函數中怎麼折騰這個形參,折騰的都是這個臨時記憶體空間,和實參沒關係,它靜靜的躺在自己的小屋裡。
什麼是按地址傳遞呢?就是直接將實參的內存空間位址傳遞給形參,這樣,形參與實參就共用一塊內存,所以,形參內容的改變也直接改變了實參的內容,你在函數中折騰形參,等同於折騰實參。
所以一般情況下,函數都會有個返回,因為函數預設都是按值傳遞,如果不返回,這個函數執行完,那些臨時記憶體空間就釋放了,執行半天啥也沒了,當然,如果你定義了按地址傳遞,那就無需返回了。