從賦值操作理解不同型別的函式傳參

2021-06-07 06:21:07 字數 1814 閱讀 3054

從賦值操作理解不同型別的函式傳參

我們都知道所謂的程式,就是對傳入的資料進行操作,最終將處理的資料輸出給使用者。那麼在我們的程式設計中的體現,就是通過函式(或者方法)引數傳入資料,然後通過函式返回值輸出處理後的資料。資料的傳入涉及到函式的實參和形參的傳遞,資料的輸出涉及到函式的返回值和返回值型別的引數。函式返回值沒有什麼特別之處,而其他的都是函式傳參的問題,既然是傳參,那麼傳參到底傳過去了什麼?

函式傳參與賦值操作

我們都知道函式傳參涉及到形參和實參,那麼實參和形參就是兩個不同的變數,所以函式傳參的過程,類似(或者說就是)使用實參給形參賦值的過程。那麼我們先來分析按值傳參的情況

圖1是值型別變數的賦值操作圖,我們大家都知道值型別變數直接儲存變數的內容,所以賦值的過程就是將vala儲存的內容直接拷貝到valb中,此時兩個變數除了儲存的值相同外,沒有其他的任何關係,所以此時修改valb的內容並不會引起vala的變化。這是與值型別按值傳參的效果是一樣的。

圖1.值型別變數賦值

圖2展示的是引用型別變數的賦值操作,我們都知道引用型別的變數儲存的是乙個位址,這個位址指向了變數內容所在的位址,也就是說引用變數儲存的是乙個位址。那麼引用型別的賦值操作同樣也是拷貝變數儲存的內容,這樣vala和valb就都指向了同樣位址。如果我們修改valb的成員,那麼vala中也會隨之產生變化。我們可以看到值型別和引用型別的賦值操作是一樣的,都是對變數直接儲存的內容的拷貝過程。但是如果我們使用其他物件對valb重新賦值,這時valb就指向了其他物件,vala還指向原來的物件並沒有變化。

圖2. 引用型別變數賦值

我們知道c#中引入了ref關鍵字,使我們可以通過函式引數返回函式的處理結果,對於我們需要同時返回多項結果的時候比較有用。其實這也就是我們通常所說的按引用傳參。圖3展示了變數位址賦值操作,此時我們使用新的物件對valb所指定的物件賦值,這是vala也就指向了新的物件了。c#中的ref是否也是這樣操作的呢?我們看以看一下下邊的**和相應的il就知道了。

圖3. 變數位址賦值操作

c#**

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace functionparameter

public class referencepara}}

對應的msil**

//傳遞的是變數的位址

.method public hidebysig instance void passvalueparameterbyreference(class functionparameter.passbyvalue/referencepara& parameter) cil managed

// end of method passbyvalue::passvalueparameterbyreference

總結從我們大學一開始接觸計算機程式設計開始,我們就開始記憶兩種函式傳參的異同,其實傳參的過程就是實參對形參賦值的過程,只不過有時拷貝的是變數的內容,有時拷貝的是變數的位址罷了。

從賦值操作理解不同型別的函式傳參

從賦值操作理解不同型別的函式傳參 我們都知道所謂的程式,就是對傳入的資料進行操作,最終將處理的資料輸出給使用者。那麼在我們的程式設計中的體現,就是通過函式 或者方法 引數傳入資料,然後通過函式返回值輸出處理後的資料。資料的傳入涉及到函式的實參和形參的傳遞,資料的輸出涉及到函式的返回值和返回值型別的引...

關於不同型別的賦值(耦合性)

a a new a a.id 1 a b new a b a b.id 2 console.writeline 引用型別賦值 console.writeline a.id.tostring console.writeline a aaa new a aaa.id 1 a bbb new a bbb....

不同型別的作業系統

據我了解,作業系統分為 windows windows98,windowsnt,windows2003,windows xp,win7,win8等 unix ibm ax,hp hp ux,sun solaris.bsd.linux 由unix擴充套件而來的。ubuntu,centos,redhat...