指針數組
在不安全上下文中,是允許指針數組的,只有幾種用於其轉換是允許的:
l 從任何數組類型到System.Array或是實現了其接口的隱式引用類型轉換同樣適用於指針數組。但是,任何試圖通過System.Array或是實現了其接口訪問數組元素都會引發一個 運行時錯誤,因為指針類型不能轉化為object。
l 從一個一維數組類型S[]到System.Collections.Generic.IList<T>或是到其基接口,任何顯示或是隱式的轉換都是不行的。因為指針類型不能被用作類型參數,還有沒有從指針類型到非指針類型的轉換。
l 從System.Array或是實現了其接口到任何數組類型顯示引用轉換適用於指針數組。
l 從System.Collections.Generic.IList<T>或是到其基接口到一個一維數組類型T[],任何顯示的轉換都是不行的。原因同上面第2條。
還有就是對於foreach語句,不適用於指針數組。相反,下面的語句
foreach (V v in x) embedded-statement
中的x是一個數組類型T[,,…,],n是數組的維度減1,T和V是指針類型,被改寫為:
{
T[,,…,] a = x;
V v;
for (int i0 = a.GetLowerBound(0); i0 <= a.GetUpperBound(0); i0++)
for (int i1 = a.GetLowerBound(1); i1 <= a.GetUpperBound(1); i1++)
…
for (int in = a.GetLowerBound(n); in <= a.GetUpperBound(n); in++) {
v = (V)a.GetValue(i0,i1,…,in);
embedded-statement
}
}
變量a,i0,i1,…對於x或者embedded-statement或者其余部分的代碼是不可見的或是不可訪問的。變量v在embedded-statement中是只讀的。如果沒有顯示轉換從T到V,那麼就會有錯誤。如果x是個null,就會有空引用異常。
表達式中的指針
在不安全上下文中,一個表達式的值可以來自於一個指針類型;但是在上下文之外,會造成編譯時期錯誤。
間接訪問
一元的*表示一個指針,被用來獲得指針指向的值。*用在void*類型表達式或是非指針類型表達式時,會造成編譯期錯誤。
*被用在null指針時是由實現來決定的。不能保證在使用時會拋出System.NullReferenceException。
如果一個非法的值賦給指針,那麼*的行為是不可預知的。
指針成員訪問
在指針成員訪問P->I中,P必須是除了void*之外的類型,I同時必須是一個可訪問的成員。
P->I效果上相同於(*P).I。例如:
using System;
struct Point
{
public int x;
public int y;
public override string ToString() {
return "(" + x + "," + y + ")";
}
}
class Test
{
static void Main() {
Point point;
unsafe {
Point* p = &point;
p->x = 10;
p->y = 20;
Console.WriteLine(p->ToString());
}
}
}