關於址傳遞的思考

2021-08-22 11:27:03 字數 1078 閱讀 6196

值傳遞:

如果引數型別是八種基本型別,那麼傳過來的就是這個引數的乙個副本,也就是這個原始引數的值,這個跟之前所談的傳值是一樣的。如果在函式中改變了副本的值不會改變原始的值.

址傳遞

如果引數型別是引用型別,那麼傳過來的就是這個引用引數的副本,這個副本存放的是引數的位址。

如果在函式中沒有改變這個副本的位址,而是改變了位址中的值,那麼在函式內的改變會影響到傳入的引數。

如果在函式中改變了副本的位址,如new乙個,那麼副本就指向了乙個新的位址,等函式結束,副本的生命週期也就結束了。而傳入的引數還是指向原來的位址,所以不會改變引數的值。

看一段**:

public

class t180806

static

void test(mynum t, mynum a1)

}

public

class mynum

public

intgeta()

public

void

seta(int a)

@override

public string tostring()

}

執行結果:

c = mynum [a=1]

c1 = mynum [a=3]

分析:

在test1中c、c1的值分別賦值給兩個形參(他倆的值是倆位址,c指向new mynum(1),c2指向new mynum(2),這裡我簡稱區域1和區域2)。

當t= a1時,t指向指向區域2,當執行t.seta(3)時,區域2的值被修改為3。

當test的生命週期結束時,兩個形參t和a1所在棧建立的空間也被銷毀。

但是他們被銷毀前所指向的堆內的區域,依舊存在,他們對其做的修改,依舊有效。

當輸出c和c1時,c和c1依舊分別指向區域1和區域2。輸出也就是 1和3

值傳遞 和址傳遞

c 關於引數按值傳遞和按址傳遞的,swap為乙個交換函式 交換2個數的值,通常交換值的時候會用到臨時變數,本例中直接通過原有變數進行操作實現了變數的值的交換 code class program b a,b 值傳遞 void swap int a,int b b a,b static void ma...

C語言 值傳遞與址傳遞

一 三道考題 1.考題一 程式 如下 void exchg1 int x,int y void main 輸出的結果 x y a b 問下劃線的部分應是什麼,請完成。2.考題二 如下 exchg2 int px,int py main 輸出的結果為 px py a b 問下劃線的部分應是什麼,請完成...

解析C C 值傳遞和址傳遞的區別

按值傳遞 在呼叫函式中將原函式的值拷貝乙份過去被呼叫的函式,在被呼叫函式中對該值程式設計客棧的修改不會影響原函式的值。按位址傳遞 在呼叫函式的時候將原函式的值所在的位址拷貝乙份過去,被呼叫函式對這個位址所作的修改會影響原來的值。首先我們要知道 a的位址 和 a位址中的內容 的區別,資料是存放在記憶體...