差點被遺忘的「區域性變數」和「引用傳遞」

2022-08-11 09:30:13 字數 1562 閱讀 7340

今天被乙個小夥伴的問題差點問來悶起,起因是**如下:

public static voidmain(string args) 

private static voidtestexchangelist(list a, list b)

結果為:
testexchangelist a=[3]

a=[1, 2]

b=[3]

問題是為什麼方法中的引數為引用傳遞,但是 testexchangelist()方法中的賦值動作沒有生效呢?

我還就順著思路往下想了一會,怎麼想都不對,覺得好像忽略了什麼。

然後,重新溫習了一下這一塊的內容,就解釋通了:

private

static

void

testexchangelist(list a, list b)

首先,方法體中區域性變數和方法引數在jvm中的儲存方法是相同的,都是在棧上開闢空間來儲存的,隨著進入方法開闢,退出方法**。也可以理解為方法引數等同於方法中的區域性變數。在呼叫 testexchangelist(list a,list b) 方法時,會先建立多2個區域性變數 a 和 b ,

然後將傳遞過來的值賦值給 區域性變數a 和 區域性變數b ,此時的引用關係為:

但是當 testexchangelist() 方法中執行完a=b後,此為賦值操作,對於物件而言,就是將b的引用位址賦值給a,此時的引用關係就發生了變化:

此時 區域性變數 a 的位址指向了區域性變數 b 的位址,區域性變數 b 的指向位址 和 變數 b 的位址是一樣的。(後來一想,變數名稱相同可能有點誤導了我最開始的判斷,哈哈哈^_^~~)

所以此時 操作區域性變數 a ,就等於操作了main方法中變數 b 的值。但是main方法中變數 a 沒有一點變化,

所以此時列印 區域性變數 a 的結果應該為:

testexchangelist a = [ 3 ],也就是區域性變數 b,也可以說變數 b 的值,
而此時的引用關係為:

當 testexchangelist()執行完後,區域性變數消失,那麼此後的引用關係就變成了這樣:

所以在最後輸出列印 集合 a 和 集合 b 時的結果就應該是:

a=[1, 2]

b=[3]

所以,所以,此 a 非彼 a,只是自己差點忘了最基礎的東西,以此寫出來就當複習鞏固一下基礎知識點。o(∩_∩)o哈哈~

不能返回區域性變數的引用

源之 int add1 int a,int b int add2 int a,int b 請問這兩個函式返回有什麼區別,是乙個返回副本,另乙個直接返回嗎?呼叫函式add2有什麼危險嗎?add1的確返回了乙個副本,如果sum是自定義的類型別,可以很明顯看出拷貝建構函式在返回時被呼叫,對於內建型別沒什麼...

千萬不能返回區域性變數的引用??

c primer第7章函式一節,講到返回時,理解返回引用至關重要的是,千萬不能返回區域性變數的引用 意思是返回程式內部定義的變數時可能會出問題,因為當函式執行完畢後,將釋放分配給區域性物件的儲存空間。此時,對區域性物件的引用就會指向不確定的記憶體。覺得不能理解。比如求階乘時,可以使用迭代函式的方法,...

引用與區域性變數的返回問題

今天剛相對徹底的搞懂函式返回區域性普通變數 不包括指標和引用 與區域性指標 引用的返回區別,先看下面 include include using namespace std string version1 const string s1,const string s2 const string ve...