C# 快速導覽 - 指標

指標 (pointer) 是儲存記憶體位址的資料型態 (data type) ,例如

class Demo {
    static void Main() {
        int a = 22;
        System.Console.WriteLine(a);
        
        unsafe {
            int* aPtr = &a;
            *aPtr = 10;
            System.Console.WriteLine(*aPtr); 
        }
        
        System.Console.WriteLine(a);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:pointer1.cs
    功能:示範 C# 程式 
    作者:張凱慶
    時間:西元 2013 年 6 月 */


編譯執行,結果如下



mono 編譯 unsafe 的內容,需要在命令列加上參數 -unsafe 。


由於指標是不安全的內容,因此要用 unsafe 宣告,相關程式碼放在 unsafe 之後的大括弧中
unsafe {
    int* aPtr = &a;
    *aPtr = 10;
    System.Console.WriteLine(*aPtr); 
}


這裡,指標變數 (variable) 的宣告用 int* ,也就是型態關鍵字 (keyword) 後加上星號
int* aPtr = &a;


& 則是取址運算子,此例會取得 a 的記憶體位址,然後儲存在 aPtr 之中。


第 8 行,這裡的星號是反參考運算子,會將等號右邊的值指派到 aPtr 所指向的變數中,也就是 a
*aPtr = 10;


同樣的,第 9 行的星號等同取出 aPtr 所指向變數的值,然後在命令列中。


unsafe 也可直接放在方法的宣告中,我們可將上例更改如下
class Demo {
    unsafe static void Main() {
        int a = 22;
        System.Console.WriteLine(a);
        
        int* aPtr = &a;
        *aPtr = 10;
        System.Console.WriteLine(*aPtr); 
        
        System.Console.WriteLine(a);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:pointer2.cs
    功能:示範 C# 程式 
    作者:張凱慶
    時間:西元 2013 年 6 月 */


編譯執行會得到相同的結果。


中英文術語對照
指標pointer
資料型態data type
變數variable
關鍵字keyword


您可以繼續參考
其他內建型態


相關目錄
回 C# 快速導覽
回 C# 教材
回首頁


參考資料
Standard ECMA-334 C# Language Specification
msdn: 指標型別 (C# 程式設計手冊)
msdn: unsafe (C# 參考)
msdn: Unsafe 程式碼和指標 (C# 程式設計手冊)

1 則留言:

Hughes 提到...

非常詳細實用!!
謝謝版主分享^___^