C 引數傳遞 引用型別 值型別等的理解

2022-03-16 02:22:27 字數 886 閱讀 9986

本部落格不屬於技術貼,主要是記錄一些自己對不懂得地方的理解和學習的記錄,請帶著批判的眼光閱讀~

值型別儲存在棧上,引用型別儲存在堆上。棧是由高到低儲存的,遵循先進後出的原則,是記憶體提前分配好的區域,記憶體的釋放不由人控制,用完後就會釋放記憶體。堆是動態分配的記憶體區域,是無序的,受人為控制釋放,但是達到一定記憶體儲存點後,會由gc自動釋放記憶體。

淺拷貝是不完全複製,只會複製頂級物件,對於值型別淺拷貝是完全複製,對於引用型別是拷貝的引用,不是拷貝引用的物件。深拷貝是完全複製,2個之間互不影響。

比如=就是淺拷貝,如果等號兩邊的變數都是值型別的,那麼改變其中乙個的值對另乙個不會產生影響,但是如果兩邊是引用變數,則拷貝的是變數的引用關係,2個變數指向的是同乙個物件例項,因此改變乙個的內容,另乙個也會改變。

引數傳遞預設是值傳遞(預設),就是屬於淺拷貝,引數的改變與原值沒關係。還有另外3中方法ref傳遞、out傳遞和params傳遞。

ref和out改變的是傳遞引數的方式,將原來的值傳遞改為引用傳遞,傳遞的是對引數變數本身的引用,因此傳遞的引數內容的改變會導致原值的改變

區別是ref要求在傳遞前要初始化賦值,在方法內部可以改變

out不要求傳遞前賦值,但是必須在返回前進行賦值

都可以返回多個引數,都可以改變傳遞的引數的原值

params傳遞用在引數數目可變且型別一樣是,傳遞的引數在傳入方法時會被編譯成陣列的形式

對已宣告的變數重新 new重新建乙個例項,記憶體中新開一塊區域,引用變數重新指向新例項,引用變數儲存的是對該例項的引用的位址值

不加ref和out時:引數傳遞時類似於對該引數進行了淺拷貝,複製了乙份,傳遞的引數和原值都是指向同乙個例項,在方法內對該引數重新new新建例項時,引數指向改變,但是原值的指向不變,如果是在方法內對引數的內容進行改變,則原值同樣改變,因為引數和原值是指向的同乙個例項

關於C 值型別,引用型別,值傳遞,引用傳遞

說到引數傳遞,必須得弄清值型別和引用型別 為了容易表達,我暫且命名存放在堆中的內容為堆中物件,存放在棧上的內容為棧中物件。值型別存放在棧中,直接訪問。如果有 int a 0 int b a 就產生了兩個棧中物件。引用型別需要在堆中顯式分配,且不能直接訪問,需要在棧中分配乙個棧中物件 c 叫指標,c ...

C 值型別和引用型別的引數傳遞(ref,out)

c 中有兩種型別,值型別,和引用型別。在記憶體中值型別是直接儲存在記憶體的棧中的,引用型別在棧中存放乙個位址,這個位址指向堆中的資料 引用型別的資料是存放在堆中的 下面我們來看看兩種型別引數傳遞有什麼區別 先看乙個例子 值型別的引數傳遞 class valueparms public void ad...

值傳遞與引用傳遞 引數型別

根據儲存方式不同,我們將資料型別分為值型別和引用型別。值型別 基本資料型別 int float double boolean long 列舉 結構。儲存在棧當中的,提取資料快,但是分配空間多,耗資源,建議資料量少的情況下使用。引用型別 object型別 類 陣列 介面 值傳遞 1 直接傳遞值型別 結...