原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx
在不安全的上下文中,類型可以是指針類型、值類型或引用類型。 指針類型聲明采用下列形式之一:
type* identifier; void* identifier; //allowed but not recommended
以下任一類型均可為指針類型:
-
sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool。
-
任何枚舉類型。
-
任何指針類型。
-
任何僅包含非托管類型字段的用戶定義的結構類型。
指針類型不從 object 繼承,並且指針類型與 object 之間不存在轉換。 此外,裝箱和取消裝箱不支持指針。 但是,你可在不同的指針類型之間以及指針類型和整型之間進行轉換。
在同一個聲明中聲明多個指針時,星號 (*) 僅與基礎類型一起寫入;而不是用作每個指針名稱的前綴。 例如:
int* p1, p2, p3; // Ok int *p1, *p2, *p3; // Invalid in C#
指針不能指向引用或包含引用的 struct,因為無法對對象引用進行垃圾回收,即使有指針指向它也是如此。 垃圾回收器並不跟蹤是否有任何類型的指針指向對象。
myType* 類型的指針變量的值為 myType 類型的變量的地址。 下面是指針類型聲明的示例:
示例 |
說明 |
---|---|
int* p |
p 是指向整數的指針。 |
int** p |
p 是指向整數的指針的指針。 |
int*[] p |
p 是指向整數的指針的一維數組。 |
char* p |
p 是指向字符的指針。 |
void* p |
p 是指向未知類型的指針。 |
指針間接尋址運算符 * 可用於訪問位於指針變量所指向的位置的內容。 例如,請考慮以下聲明:
int* myVariable;
表達式 *myVariable 表示在 myVariable 中包含的地址處找到的 int 變量。
主題fixed 語句(C# 參考)和指針轉換(C# 編程指南)包含了多個指針示例。下面的示例顯示需要 unsafe 關鍵字和 fixed 語句以及如何遞增內部指針。你可將此代碼粘貼到控制台應用程序的 Main 函數中來運行它。(記住在“項目設計器”中啟用不安全代碼;選擇菜單欄上的“項目”、“屬性”,然后選擇“生成”選項卡中的“允許不安全代碼”。)
// Normal pointer to an object. int[] a = new int[5] {10, 20, 30, 40, 50}; // Must be in unsafe code to use interior pointers. unsafe { // Must pin object on heap so that it doesn't move while using interior pointers. fixed (int* p = &a[0]) { // p is pinned as well as object, so create another pointer to show incrementing it. int* p2 = p; Console.WriteLine(*p2); // Incrementing p2 bumps the pointer by four bytes due to its type ... p2 += 1; Console.WriteLine(*p2); p2 += 1; Console.WriteLine(*p2); Console.WriteLine("--------"); Console.WriteLine(*p); // Deferencing p and incrementing changes the value of a[0] ... *p += 1; Console.WriteLine(*p); *p += 1; Console.WriteLine(*p); } } Console.WriteLine("--------"); Console.WriteLine(a[0]); Console.ReadLine(); // Output: //10 //20 //30 //-------- //10 //11 //12 //-------- //12
你無法對 void* 類型的指針應用間接尋址運算符。 但是,你可以使用強制轉換將 void 指針轉換為任何其他指針類型,反之亦然。
指針可以為 null。 將間接尋址運算符應用於 null 指針將導致由實現定義的行為。
請注意,在方法之間傳遞指針會導致未定義的行為。 示例通過 Out 或 Ref 參數或作為函數結果返回一個指向局部變量的指針。 如果已在固定塊中設置指針,則它指向的變量不再是固定的。
下表列出了可在不安全的上下文中對指針執行的運算符和語句:
運算符/語句 |
用法 |
---|---|
* |
執行指針間接尋址。 |
-> |
通過指針訪問結構的成員。 |
[] |
為指針建立索引。 |
& |
獲取變量的地址。 |
++ 和 -- |
遞增和遞減指針。 |
+ 和 - |
執行指針算法。 |
==、!=、<、>、<= 和 >= |
比較指針。 |
stackalloc |
在堆棧上分配內存。 |
fixed 語句 |
臨時固定變量以便找到其地址。 |