C 中的值型別和引用型別以及堆疊

2022-08-20 09:06:10 字數 1742 閱讀 2279

引用型別如: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 中堆疊對於值型別 引用型別的意義 堆疊在這裡和棧等同 1 值型別 在c 中有int long float char bool enum struct 結構體 double等常用型別 這裡需要注意的是最後的struct 結構體 和cla...

C 值型別和引用型別在記憶體中的儲存(堆疊)

前言 值型別和引用型別都是用來儲存資料的 值型別存資料,引用型別存引用 但是這兩種型別本身又需要儲存在記憶體中。堆疊出現的原因 在程式執行中,為了提高程式的執行效率,就分出了一大一小兩塊區域來分別儲存不同型別的資料,分別是堆和棧 區域小的棧,讀取速度相對較快,區域大的堆,讀取速度相對較慢。概念 資料...

C 中引用型別和 值型別

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