C 引用型別作為函式引數時

2021-07-04 05:32:23 字數 624 閱讀 1882

在**本文的主題之前,先來介紹下c#中的值型別和引用型別

眾所周知c#中有值型別和引用型別,值型別有基礎資料型別(諸如int,double,bool等)、結構體、列舉,引用型別有介面、類、委託。

值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這個物件的位址。

因此c#的引用型別其實就如同c++的指標型別。

下面我再來看看函式傳參的問題。

早在c時代就有函式引數傳值和傳位址的概念,請記住在c#中函式引數預設都是傳值。

所以不管是值型別還是引用型別在作為引數傳進函式時,其實都是傳的值,只不過引用型別傳的是物件在堆中的的位址罷了。

而且從上面的定義可以看出c#中引用型別的變數用c++來說就相當於是該引用型別的指標,比如有類(引用型別)refclass:

refclass rc就相當於是c++上的refclass *rc

在c#中使用rc.intvalue++;時,相當於c++的rc->intvalue++;

因為引用型別在函式傳參時是傳位址的,所以我腦袋裡就形成了一種慣性思維,認為只要傳進函式的是引用型別,那麼在函式中做的任何更改都會反映到實參上。但是我發現並不完全是這樣,下面給出個例子(注釋內容為對應等效的c++**):

C 引用型別作為函式引數時

在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...

C 引用型別作為函式引數時

在 本文的主題之前,先來介紹下c 中的值型別和引用型別 眾所周知c 中有值型別和引用型別,值型別有基礎資料型別 諸如int,double,bool等 結構體 列舉,引用型別有介面 類 委託。值型別全部在作業系統的棧空間中申請,而引用型別則在作業系統的堆空間中建立物件,然後在棧空間中申請乙個指標指向這...

C 引用作為函式引數

有了變數名,為什麼還需要乙個別名呢?c 之所以增加引用型別,主要是把它作為函式引數,以擴充函式傳遞資料的功能。到目前為止我們介紹過函式引數傳遞的兩種情況。1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回給實參。因為在呼叫函式時,形參和實...