標籤:c# 指標 學習 筆記 指標類型
大學的時候學過C++、C,最近工作也不是很忙,就想起看看C#中的指標,看看、回憶一下啊,指標的用法,以下學習筆記摘自msdn:指標類型
在不安全的上下文中,類型可以是指標類型以及值類型或參考型別。指標型別宣告具有下列形式之一:
type* identifier;void* identifier; //allowed but not recommended
下列類型都可以是指標類型:
指標類型不繼承 object,並且指標類型與 object 之間不存在轉換。此外,裝箱和unboxing不支援指標。但是,允許在不同指標類型之間以及指標類型與整型之間進行轉換。
當在同一個聲明中聲明多個指標時,* 僅與基礎類型一起使用,而不是作為每個指標名稱的首碼。例如:
int* p1, p2, p3; // Okint *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 參數向局部變數返回指標或作為函數結果向局部變數返回指標。如果將指標設定在固定的塊中,它所指向的變數可能不再是固定的。
下表列出可在不安全的上下文中針對指標執行的運算子和語句:
| 運算子/語句 |
用途 |
|
* |
執行指標間接定址。 |
|
-> |
通過指標訪問結構的成員。 |
|
[] |
對指標建立索引。 |
|
& |
擷取變數的地址。 |
|
++ 和 -- |
遞增或遞減指標。 |
|
加、減 |
執行指標演算法。 |
|
==、!=、<、>、<= 和 >= |
比較指標。 |
|
stackalloc |
在堆棧上分配記憶體。 |
|
fixed 語句 |
臨時固定變數以便可以找到其地址。 |
程式碼範例:
// cs_unsafe_keyword.cs// compile with: /unsafeusing System;class UnsafeTest{ // Unsafe method: takes pointer to int: unsafe static void SquarePtrParam(int* p) { *p *= *p; } unsafe static void Main() { int i = 5; // Unsafe method: uses address-of operator (&): SquarePtrParam(&i); Console.WriteLine(i); }}輸出
25
C# 指標學習筆記之指標類型