值傳遞和引用傳遞的區別

2021-09-22 21:29:26 字數 3035 閱讀 2012

以值傳遞引數

當實參當作值來傳遞時,就產生了乙個新的拷貝。

class test     ", x);  

static void fo(int p)  

p = p + 1;  

console.writeline("p=", p);  

}    程式執行結果為:p=9,x=8;即x的值不會受p影響,給p賦乙個新值並不會改變x的內容,因為p和x存在於記憶體中不同的位置。

同理,用傳值的方式傳遞乙個引用型別物件時,只是複製這個物件本身,即複製其位址值,而不是它指代的物件。下面**中fo中看到的stringbuilder物件,就是在main方法中例項化的那乙個,只是有不同的引用指向它而已。  static void fo(stringbuilder fosb)  

fosb = null;  

static void main()  

stringbuilder sb = new stringbuilder();  

fo(sb);  

console.writeline(sb.tostring());  

}    執行結果:test.

換句話說,sb和fosb是指向同一物件的不同引用變數。因為fosb是引用的拷貝,把它置為null並沒有把sb置為 null.

ref修飾符

當使用rel關鍵字時,表示是用引用的方式傳遞引數。實參和形參引用的都是同乙個物件,改變其中乙個的引用值,另乙個也會改變。  

static void main(string args)  

int x = 8;  

fo(ref x);  

console.writeline("x=", x);  

static void fo(ref int p)  

p = p + 1;  

console.writeline("p=", p);  

}    執行結果:p=9;x=9  。  

如果在函式fo中改變p的值,則x的值也會隨之改變。  static void main(string args)  

int x = 8;  

fo(ref x);  

console.writeline("x=", x);  

static void fo(ref int p)  

p = 10;  

p = p + 1;  

console.writeline("p=", p);  

}  執行結果:p=11,x=11;

ref修飾符在寫函式和呼叫函式時都一定要出現。

ref修飾符主要應該於實現交換的方法中。  static void swap(ref string a, ref string b)  

string temp = a;  

a = b;  

b = temp;  

static void main()  

string x = "hello";  

string y = "world";  

swap(ref x, ref y);  

console .writeline (x);  

console.writeline(y);  

}   執行結果:world hello

out修飾符

out修飾符與ref修飾符非常相似,除了以下兩點為:

一,在呼叫函式時不需要賦值。

二,在函式退出前必須賦值。

out修飾符通常用於需要從方法中獲取多個返回值的時候  static void split(string name, out string firstname, out string lastname)  

int i=name .lastindexof (' ');  

firstname =name .substring (0,i);  

lastname =name .substring (i+1);  

static void main()  

string name = "steven francis";  

string a, b;  

split(name, out a, out b);  

console .writeline (a);  

console .writeline (b);  

}    執行結果:a=steven,b=francis  總結:  1,值傳遞時,為什麼被呼叫的方法中的形參值的改變不會影響到相應的實參?

答:因為按值傳遞時,系統首先為被呼叫的方法的形參分配記憶體空間,然後把實參中的值按位置一一對應「複製」給形參。形參中儲存的值只是乙份實參的拷貝,因此被呼叫方法中形參值的任何改變都不會影響到相應的實參。

2,值傳遞和引用傳遞有什麼不同,什麼是值引數,它以什麼方式傳遞?答:值 傳遞時,系統首先為被呼叫方法的形參分配記憶體空間,並將實參的值按位置一一對應地複製給形參,此後,被呼叫方法中形參值得任何改變都不會影響到相應的實 參; 而引用傳遞時,系統不是將實參本身的值複製後傳遞給形參,而是將其引用值(即位址值)傳遞給形參,因此,形參所引用的該位址上的變數與傳遞的實參相同,方 法體內相應形參值得任何改變都將影響到作為引用傳遞的實參。

3,什麼是形參,什麼是實參?答: 形參:在定義函式中指定的引數就是形參,在未出現函式呼叫時,他們並不佔記憶體中的儲存單元,只有在發生函式呼叫時,函式中的形參才被分配記憶體單元。在呼叫結束後,形參所佔的記憶體單元也被釋放。

實參:實參可以是常量、變數和表示式,但要求有確定的值。在呼叫時將實參的值賦給形參。在記憶體中,實參單元和形參單元是不同的單元。在呼叫函式時,給形參分配儲存單元,並將實參對應的值傳遞給形參,呼叫結束後,形參單元被釋放,實參單元仍保留原值。 

理解:實參就是送進去方法中的東西~~行參就是把送進來的東西在方法中進行拷貝加工,加工完後方法就返回乙個東西--返回值。

值傳遞的時候,實參是不變的~形參是隨著計算而變化的~~ 引用傳遞的時候~~行參怎麼變~實參就怎麼變.... 

引數的傳遞分為:1.值方式引數傳遞,2.引用方式引數傳遞。

引用傳遞和值傳遞的區別

有這麼一道面試題,題目如下 view plain using system public class test1 p.name,num static void a1 person p,intnum public class person 說說上面的程式產生的結果,以及產生這個結果的原因是什麼?我在以...

值傳遞和引用傳遞的區別

public class test 執行 得到的當前的結果如下 int1 10int2 10改變之後 int1 10int2 20process finished with exit code 0根據結果會發現int型別的傳遞,當int2值改變的時候,int1的值是沒有任何變化的,所以基本型別都是根...

值傳遞和引用傳遞的區別

值傳遞 值傳遞是指在呼叫函式時將實際引數複製乙份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。引用傳遞 引用傳遞是指在呼叫函式時將實際引數的位址傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。陣列作為方法引數傳遞時,傳遞的引數是陣列記憶體的位址.陣列作為方法的返...