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為止。一旦超過這個有效期,變數的值就不復存在了。所以,如果想要列印出乙的蘋果數,只能在使用該變數的過程中列印,超出這個過程對該變數的任何操作都是毫無意義的。
按值傳遞和按引用傳遞
對於基本型別而言,是按值傳遞的 基本型別儲存在棧中 基本型別引數的傳遞和基本型別的複製一樣,傳遞的是值本身 var a 1 function test x test a console.log a 1按值傳遞的意思就是形參是實參的複製,形參實參互不干擾 so,雖然在函式test中a被修改,但是並沒有...
Java按值傳遞和按引用傳遞
如果傳遞引數是基本型別或其包裝類,則按值傳遞,改變引數的值,實際引數的值不變。public static void main string args public static void changei integer i 如果傳遞引數是類或陣列,則按引用傳遞,改變物件的引用,實參的引用不會改變,但...
按值傳遞和引用傳遞
最近在看到函式按值傳遞還是引用傳遞的時候產生了困惑,突然想到這個問題好像從第一次看紅寶書就一直有這個困惑,於是各種搜,但是網上的種種回答也很不相同,想了兩天終於算是有個理由可以說服自己了。我們先不討論按值傳遞和引用傳遞的名字的定義,很多時候都是被名字的定義誤導了。實質重於形式,名字可以有很多,我們就...