值型別的變數 vs 引用型別的變數
值型別:結構體,列舉,int、char、bool、decimal、double
引用型別:陣列、自定義類、string、介面、集合、object
儲存的地方:
值型別的值是儲存在記憶體的棧當中。
引用型別的值是儲存在記憶體的堆當中。
下圖展示了值型別與引用型別在計算機中的儲存方式
值型別的 int num = 10; 在記憶體中,是被儲存在棧上的空間中;
引用型別的 string s = "123"; 在記憶體中,堆上位址為0x001001的空間中儲存了 「123」,然後,棧上面儲存的是堆上空間的位址 0x001001 。
我們自定義的類 person zs = new person(); zs.name = "張三"; 在記憶體中,堆上位址為0x010101的空間中儲存了zs這個物件,包括這個物件的name屬性的值。,然後,我們可以在棧上找到其在堆上的位址0x010101 。
值型別我們稱之為值傳遞,引用型別我們稱之為引用傳遞。
值型別和引用型別的區別:
1. 值型別和引用型別在記憶體上儲存的地方不一樣。
2. 在傳遞
值型別和傳遞引用型別的時候,傳遞的方式不一樣。
3. int、double等型別在未賦予初值的時候,預設值為0;引用型別在未賦予初值的時候,值為null。
classprogram
static
void main(string
args)
,j = ,k =
",i,j,k);
//輸出結果 i = 11,j = 20,k = 10
person p1 = new person(20
); person p2 = p1; //
p2與p1指向了同一塊記憶體
p1._age++; //
p1對記憶體中的變數進行操作後,通過p2取出變數的值,變數的值當然會發生改變
console.writeline("
p1._age = ,p2._age = ,
", p1._age, p2._age);
//輸出:p1._age = 21,p2._age = 21
setpersonage(p2,
30);//
通過函式來傳遞的情形也是相同的
console.writeline("
after setage.");
console.writeline(
"p1._age = ,p2._age = ,
", p1._age, p2._age);
//輸出:p1._age = 30,p2._age = 30
}
public
class
person}}
引用傳遞與值傳遞
看 define n 10000 define n 10000 ini set memory limit 1g function microtime float function printarray0 arr 引用傳遞 function printarray1 arr 值傳遞 for i 0 i ...
值傳遞與引用傳遞
分析 形參是實參的拷貝,改變形參的值並不會影響外部實參的值。由於x 1 是在test方法棧裡面執行的,所以只會改變test方法棧裡面的x值,而不會改變main方法棧裡面的x值 形參的改變不會影響實參 引用傳遞,傳遞的是實際引數的位址.傳遞的是值的引用,也就是說傳遞前和傳遞後都指向同乙個引用 同乙個記...
值傳遞與引用傳遞
值傳遞,只是傳遞副本,而引用傳遞,是傳遞乙個位址 using system using system.collections.generic using system.linq using system.text v console.writeline 引用傳遞,結果為!r static void ...