653
人物
C# 指針學習筆記之指針類型
大學的時候學過C++、C,最近工作也不是很忙,就想起看看C#中的指針,看看、回憶一下啊,指針的用法,以下學習筆記摘自msdn:指針類型
在不安全的上下文中,類型可以是指針類型以及值類型或引用類型。指針類型聲明具有下列形式之一:
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#
指針不能指向引用或包含引用的結構,因為即使有指針指向對象引用,該對象引用也可能會被執行垃圾回收。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: /unsafe using 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
最後更新:2017-04-04 07:32:01