C 的兩種類據型別 類和結構體

2021-08-06 08:32:53 字數 1599 閱讀 3076

本文主要是討論棧和堆的含義,也就是討論

c#的兩種類據型別

:值型別和引用型別;

雖然我們在.net中的框架類庫中,大多是引用型別,但是我們程式設計師用得最多的還是值型別。

引用型別如:string,object,class等總是在從託管堆上分配的,c#中new操作符返回物件的記憶體位址--也就是指向物件資料的記憶體位址。

以下是值型別與引用型別的表:

我們來看下面一段**:

首先在類中宣告

乙個class類

,和乙個struct結構,如圖:

並使用在程式入口呼叫它們,如圖:

現在我們來看一看,它們在記憶體當中是如何儲存的?

從這張圖可以看出,class(類)例項化出來的物件,指向了記憶體堆中分配的空間

struct(結構)

例項化出來的物件

,是在記憶體棧

中分配

接下來,我們再來在上面的程式做如下修改:

紅框,**定義乙個class例項化物件s2,然後把物件s1賦值給s2

藍框,**定義乙個結構例項化物件r2,然後把物件r1賦值給r2

那它們輸出的結果是多少呢?請選擇(   )

a、  s1的值為:12     s2的值為222

r1的值為:16     r2的值為666

b、  s1的值為:12     s2的值為222

r1的值為:666    r2的值為666

c、  s1的值為:222    s2的值為222

r1的值為:16     r2的值為666

d、  s1的值為:222     s2的值為222

r1的值為:666     r2的值為666

正確答案是:c

為什麼會這樣呢

?所以我們來看一看,多個值型別和引用型別在記憶體裡面是如何儲存的,如圖:

從圖中,可以看出,兩個引用型別 s1,s2都指向了同乙個拖管堆上的空間,

當某乙個發生改變的時候,其於的會發生變化

而結構是值型別,雖然使用r2=r1,把r1物件賦值給r2,

當修改某乙個物件的值的時候,

不會影響到另乙個物件

所以,值型別和引用型別的區別就是:

1、它們儲存的位置不一樣

2、如果是引用型別,當兩個物件指向同乙個地方,修改某乙個的時候,其它物件的值會發生改變  

C 的兩種類據型別 值型別和引用型別

值型別直接儲存其值,而引用型別儲存對其值的引用。部署 託管堆上部署了所有引用型別。引用型別 基類為objcet 值型別 均隱式派生自system.valuetype 值型別 byte,short,int,long,float,double,decimal,char,bool 和 struct 統稱為...

C 結構體型別和類型別

當我們需要定義一些需要定義一些型別的時候,需要用到一些欄位和屬性的集合,有人會用類型別。也有人會用結構體型別。結構和類的區別 1 結構是值型別,它在棧中分配空間 而類是引用型別,它在堆中分配空間,棧中儲存的只是引用。2 結構型別直接儲存成員資料,讓其他類的資料位於對中,位於棧中的變數儲存的是指向堆中...

兩種型別的員工

假如你是村莊的工人,負責為村落供水,那你對村民來說很有價值。這裡有兩種型別的工人 型別1 抓起一兩個空桶,接著去甘泉湖打滿水,返回村莊,20號人因此歡喜。在回來的路上,工人必須喝一部分水,並且一旦返回,他得帶點水回家。型別2 工人沒有考慮自身能得到多少水。他也沒有拿桶去打水,相反,他拿了一把鐵鍬和乙...