指標型別 (C# 程式設計手冊)
更新:2007 年 11 月
在 unsafe 內容中,型別有可能是指標型別、實值型別 (Value Type) 或參考型別。指標型別宣告會使用下列其中一種格式:
type* identifier;
void* identifier; //allowed but not recommended
下列任何一個型別都可能是指標型別 (Pointer Type):
sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal 或 bool。
任何列舉型別。
任何指標型別。
任何只包含 Unmanaged 型別欄位的使用者定義結構型別。
指標型別不會繼承自 object,而且指標型別與 object 之間無法進行轉換。此外,boxing 和 unboxing 不支援指標。不過,不同的指標型別之間以及指標型別與整數類資料型別之間可以進行轉換。
當您在相同的宣告中宣告多個指標時,只能將 * 寫在基礎型別旁,而不能在每個指標名稱前面都加上 *。例如:
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
指標無法指向參考或包含參考的結構,因為物件參考不能是記憶體回收的物件 (即使有指標指向它也是一樣)。GC 不會持續追蹤是否有任何指標型別指向物件。
型別 myType* 的指標變數值是型別 myType 的變數位置。以下是指標型別宣告的範例:
範例 |
說明 |
---|---|
int* p |
p 為整數的指標 |
int** p |
p 為整數指標的指標 |
int*[] p |
p 為整數的一維陣列指標 |
char* p |
p 為字元的指標 |
void* p |
p 為未知型別的指標 |
您可以使用指標間接取值運算子 *,存取指標變數所指向位置的內容。例如,請參考下列宣告:
int* myVariable;
此運算式 *myVariable 表示了位於 myVariable 所包含之位址的 int 變數。
間接取值運算子無法套用至型別 void* 的指標。不過,您可使用轉型,將 Void 指標轉換為任何其他指標型別,反之亦然。
指標可以是 null。將間接取值運算子套用於 null 指標會導致由實作環境決定行為。
請注意,在方法之間傳遞指標時,可能會導致未定義的行為。例如,透過 Out 或 Ref 參數,或函式結果,傳回指向區域變數的指標。如果已在固定區塊中設定指標,則其指向的變數就可能不再是固定的。
下表所列出的運算子和陳述式可以用於 unsafe 內容中的指標:
運算子/陳述式 |
用途 |
---|---|
* |
執行指標間接取值。 |
-> |
透過指標存取結構的成員。 |
[] |
索引指標。 |
& |
取得變數位址。 |
++ 和 -- |
遞增和遞減指標。 |
+ 和 - |
執行指標算術。 |
==、!=、<、>、<= 和 >= |
比較指標。 |
stackalloc |
在堆疊上配置記憶體。 |
fixed 陳述式 |
暫時固定變數以找到其位址。 |
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格中的下列章節:
- 18 Unsafe 程式碼