[碎碎念] 程式開發領域由菜鳥到老鳥的成長歷程 (14) - 菜鳥階段-學會指標的概念

雖然會有人說這東西不是在學校就學過了嗎?只是,有些現代程式語言內都隱含了它的概念,但卻有很多人無法意會,只因為指標作業被系統本身做掉了。

指標 (pointer) 這東西是 C/C++ 主要的功能之一,其功能是保存變數的位址,以供程式直接對記憶體位址進行讀寫,函數指標 (function pointer) 則是賦與程式透過指標去呼叫函數的能力,雖然概念簡單,但卻是 C/C++ 中最難學習的部份,而且指標不當使用很容易造成系統不穩定,因此比較新的程式語言都會把指標包裝在核心內,不讓程式開發人員直接接觸到指標 (ex: Java, C#),但有些程式語言會保留指標的能力 (ex: C# 的 unsafe),指標最大的優點就是效能,因為是直接操作記憶體,所以效能會好的沒話說,也因此重視效能的程式都會以 C/C++ 來開發,就是因為它們可以直接應用指標。

如果是寫 Java, C# 這種語言的人,老實說是不需要太在意指標這玩意的,但是基於物件導向的程式語言特性,一定會分為物件本身以及實值本身,以 C# 為例,所有實值型別都是由 System.ValueType 命名空間繼承,核心 (CLR) 遇到實值型別作業時,會直接使用複製與覆蓋記憶體內容的方式處理,但若是物件的話,會採用一個叫做參考 (Reference) 的方式連接物件,這個 Reference 即是一個指標變數,預設的情況下,參考的變數會是 null (也就是沒有指向到任何物件),例如下面這段程式碼:

int i1=10;
object o1=i1;
object o2=i1;

Console.WriteLine(o1==o2);

string s1="Just For Test";
object o3=s1;
object o4=s1;

Console.WriteLine(o3==o4);

第一個回傳的訊息會是 false,因為 i1 是實值型別,CLR 會在變數賦值時以複製內容的方式處理,所以 o1 和 o2 不會是相同的物件,故傳回 false;s1 則是參考型別,CLR 會以指標方式指向 s1,所以 o3 和 o4 會是相同的物件,故傳回 true。

為什麼會寫這篇文,主要是因為很多初學者對 "參考" 這個東西的原理不熟,也不了解什麼叫做 NullReferenceException...其實就只是代表目前這個變數是空的,對它存取當然會出現錯誤,但是這些存取和檢查動作都被 CLR 包裝了,程式設計師不會直接處理它,所以才會讓一些初學者感到困惑吧。

Reference:
http://msdn.microsoft.com/zh-tw/library/x9afc042(VS.80).aspx