細說C 中的值型別和引用型別

2022-07-17 04:27:16 字數 2598 閱讀 3668

概說:

1.值型別變數中直接儲存變數的值,值型別的例項在記憶體中的儲存位置叫棧(stack)。效能很好,值型別只限於存在很小一塊的資料(所以的值型別必須小於16位元組)

2.引用型別將其資料的位址儲存在堆疊中,位址所指向的實際資料,儲存在稱為堆(heap)的記憶體區域中。

對於堆和棧:

棧(作業系統):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧

堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**,分配方式倒是類似於鍊錶。

堆(資料結構):堆可以被看成是一棵樹,如:堆排序

棧(資料結構):一種後進先出的的資料結構

下面是堆疊的分布:

棧:棧作為一種資料結構,是一種只能在一端進行插入和刪除操作的特殊線性表

堆疊可以從下面幾部分區別:

1.申請方式:

stack:

由系統自動分配。 例如,宣告在函式中乙個區域性變數 int b; 系統自動在棧中為b開闢空間

heap:

需要程式設計師自己申請,並指明大小,在c中malloc函式

2.申請效率的比較:

棧由系統自動分配,速度較快。但程式設計師是無法控制的。

堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便.

3.申請大小的限制:

棧:在windows下,是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在 windows下,棧的大小是2m(也有的說是1m,總之是乙個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。

堆和棧的區別可以用如下的比喻來看出:

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大

細說:

c#的值型別包括:結構體(數值型別,bool型,使用者定義的結構體),列舉,可空型別。

c#的引用型別包括:陣列,使用者定義的類、介面、委託,object,字串。

陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上。

引用型別在棧中儲存乙個引用,其實際的儲存位置位於託管堆。

值型別總是分配在它宣告的地方:作為欄位時,跟隨其所屬的變數(例項)儲存;作為區域性變數時,儲存在棧上。

值型別在記憶體管理方面具有更好的效率,並且不支援多型,適合用作儲存資料的載體;引用型別支援多型,適合用於定義應用程式的行為。

下面看乙個例子:

using

system;

namespace

testvalve

public

override

string

tostring ()

}struct number2 //

結構型別屬於值型別

public

override

string

tostring ()

}public

static

void main (string

args)

,n2=

",n1,n2);

number2 n3 = new number2 (0); //

結構型別的例項化

number2 n4 =n3;

n3.val += 1

; n4.val += 2

; console.writeline (

"n3=,n4=

", n3, n4);

console.readkey ();}}

}

輸出結果:

「n3=1,n4=2」,因為結構式值型別,將乙個值型別物件賦值給乙個另乙個變數將會建立兩個不同的例項物件,所以乙個物件的改變不會影響到另乙個物件,因為他們是兩個不同的物件,各有各的儲存位置。

「n1=3,n2=3」,因為類是引用型別,當修改乙個引用型別變數的時候,你修改的是這個引用所指向的資料,所有指向同乙個資料的引用,都會反應這樣的修改結果。引用型別的賦值其實是把位址賦給乙個引用型別變數,這兩個變數都指向相同的位址單元,所有兩個引用型別之間會相互影響。

C 中引用型別和 值型別

值型別 儲存在棧 stack 中,乙個值型別的變數其實是乙個記憶體位址,位址中儲存的就是值本身 包括c 的基本型別 用關鍵字int char float等來宣告 結構 用struct關鍵字宣告的型別 列舉 用enum關鍵字宣告的型別。引用型別 儲存在堆 heap 中,乙個引用型別的變數的值是乙個指標...

C 中引用型別和值型別

c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。值型別和引用型別的區別在於,值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。值型別變數直接把變數的值儲存在...

C 中引用型別和值型別

c 的值型別包括 結構體 數值型別,bool型,使用者定義的結構體 列舉,可空型別。c 的引用型別包括 陣列,使用者定義的類 介面 委託,object,字串。值型別和引用型別的區別在於,值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。值型別變數直接把變數的值儲存在...