關於VB陣列裡面按值傳遞和按位址傳遞的區別

2021-05-26 09:15:29 字數 1129 閱讀 3039

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 如果傳遞引數是類或陣列,則按引用傳遞,改變物件的引用,實參的引用不會改變,但...

按值傳遞和引用傳遞

最近在看到函式按值傳遞還是引用傳遞的時候產生了困惑,突然想到這個問題好像從第一次看紅寶書就一直有這個困惑,於是各種搜,但是網上的種種回答也很不相同,想了兩天終於算是有個理由可以說服自己了。我們先不討論按值傳遞和引用傳遞的名字的定義,很多時候都是被名字的定義誤導了。實質重於形式,名字可以有很多,我們就...