指針類型(C# 編程指南)


原文地址:https://msdn.microsoft.com/zh-cn/library/y31yhkeb.aspx

在不安全的上下文中,類型可以是指針類型、值類型或引用類型。 指針類型聲明采用下列形式之一:

 
 
type* identifier;
void* identifier; //allowed but not recommended

以下任一類型均可為指針類型:

指針類型不從 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 語句

臨時固定變量以便找到其地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM