C 值型別和引用型別

2021-09-05 12:38:16 字數 2417 閱讀 3028

之前有篇文章講到引數傳遞,

但並未對值型別和引用型別做乙個詳細的了解。

值型別和引用型別詳細的說明在右邊的**中有:

之前看了詳細說明,於是在我的腦海中就留下了乙個印像,string是引用型別。對任何引用型別做了改變就會有影響。於是這句話在下面把我成功帶入坑。

今天早上看了一篇部落格,

就講到了值型別和引用型別,我第一次看到題目我給出的答案也是錯的,看來還是被帶坑里了。

題目是這樣的:

using system;

public class test1

,", p.name, num);

}static void a1(person p, int num)

}public class person

}

說說上面的程式產生的結果,以及產生這個結果的原因是什麼?

我想著不是很簡單嗎,因為person是引用型別,對引用型別做了改變肯定會有影響,而int是值型別,則沒有影響。所以我第一次給出的答案是 :   wang   0

但是一執行,答案卻是   li    0   ,這是為什麼呢?

我自己畫了上面這個圖,應該可以很好的理解了

但是我還看到了另一篇文章,我又有乙個問題了,值型別真的不可以改變嗎?比如上面的 num在方法中做了改變,但最終輸出時卻毫無影響,這是值型別的特點。

那麼有一道題目是這樣的,如下:

public class program   ",a,b); //列印結果要為:   400  500

console.readkey();}}

這不是很奇怪嗎?因為a,b是值型別,不管怎樣都是4和5啊,怎麼會列印出400和500呢

別跟我說a*100,b*100,作為一名程式設計師,那就真的有點說不過去了。

但是仔細想一想,有一種東西很奇特,那就是 反射,利用反射就可以做到。

之前有篇反射的使用文章可以了解下:

很奇怪,我用c#語言試驗了一波,發現 反射居然也不能實現。希望知道的各位能給我答案。

我的**如下:並沒有解決問題。

using system;

using system.reflection;

namespace testsuanfa ",a,b); //列印結果要為: 400 500

console.readkey();

}//我的change方法如下,形參是自己定的,你也可以定義其它引數,只要符合題目要求就行了

public static void change(int a, int b) }}

列印如下,並沒有出現預料中的結果,希望解決的各位給我答案。

然後我用指標檢視了a,b的位址,發現了原來是位址不一樣,所以無法解決。。

using system;

using system.reflection;

namespace testsuanfa ", (int)&a, (int)&b);

}change(a,b); //自己按照要求完成這個方法 (引數中沒有 ref,有ref就簡單了)

//要求如下:

console.writeline(" ",a,b); //列印結果要為: 400 500

console.readkey();

}//我的change方法如下,引數是自己定的,你也可以定義其它引數,只要符合題目要求就行了

public static unsafe void change(int a, int b) ", (int)&a, (int)&b);

type type = typeof(int);

//值型別,預設屬性名 m_value 可通過 getfields()列印出來得到

那麼那道題目是否有答案呢?

C 值型別和引用型別

c 資料型別 值型別,引用型別 概念 值型別直接儲存其值,引用型別儲存對值的引用 這兩種型別儲存在記憶體的不同地方 值型別儲存在堆疊中,引用型別儲存在託管堆上。乙個引用型別的例子,如圖 上圖中,只有乙個user物件,u1和u2都指向包含該物件的記憶體位置 執行結果 在c 中,基本資料型別如bool和...

c 值型別和引用型別

今天我們來學習一下什麼是值型別和引用型別。1.值型別的值存在棧上,引用型別棧上存的是位址,值在堆上 2.將乙個值型別變數賦給另乙個值型別變數時,將複製包含的值。引用型別變數的賦值只複製對物件的引用,而不複製物件本身。3.裝箱是將值型別轉換為引用型別,拆箱是將引用型別轉換為值型別,利用裝箱和拆箱功能,...

C 值型別和引用型別

型別被分為兩種 值型別 整數,bool,struct 建構函式 char 字元 小數 引用型別 string 陣列 自定義的類,內建的類,物件.兩者在記憶體中的儲存方式 值型別 只需要一段單獨的記憶體,用於儲存實際的資料,單獨定義的時候放在棧中 引用型別 需要兩段記憶體 第一段儲存實際的資料,它總是...