ポインタ型 (C# プログラミング ガイド)
更新 : 2007 年 11 月
unsafe コンテキストの型には、ポインタ型、値型、または参照型を設定できます。ポインタ型の宣言は、次のいずれかの形式になります。
type* identifier;
void* identifier; //allowed but not recommended
次の型はいずれもポインタ型になります。
sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、または bool。
任意の列挙型。
任意のポインタ型。
アンマネージ型のフィールドのみを含むユーザー定義の struct 型。
ポインタ型は object を継承せず、ポインタ型と object 間の変換は存在しません。また、ボックス化とボックス化解除もポインタをサポートしません。ただし、異なるポインタ型の間で変換したり、ポインタ型と整数型の間で変換したりすることはできます。
同じ 1 つの宣言で複数のポインタを宣言する場合、* は基底の型だけに記述し、各ポインタ名のプレフィックスとして使用しません。以下にサンプルを示します。
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
オブジェクト参照は、それを指すポインタがあってもガベージ コレクションされてはならないので、ポインタが参照や参照を含む構造体を指すことはできません。GC は、オブジェクトを指すポインタ型があるかどうかを追跡しません。
myType* 型のポインタ変数の値は、myType 型の変数のアドレスです。ポインタ型の宣言の例を次に示します。
例 |
説明 |
---|---|
int* p |
p は、整数へのポインタです。 |
int** p |
p は、整数へのポインタのポインタです。 |
int*[] p |
p は、整数へのポインタの 1 次元配列です。 |
char* p |
p は、char へのポインタです。 |
void* p |
p は、未知の型へのポインタです。 |
ポインタ間接演算子 * を使用すると、ポインタ変数が指す位置にあるコンテンツにアクセスできます。たとえば、次のような宣言があるとします。
int* myVariable;
この例の式 *myVariable は、myVariable に含まれているアドレスの位置にある int 変数を示しています。
間接演算子は、void* 型のポインタに適用できません。ただし、void ポインタと他のポインタ型はキャストを使用して相互に変換できます。
ポインタは、null にできます。null ポインタに間接演算子を適用すると、実装で定義されている動作が発生します。
ポインタをメソッド間で引き渡すと、未定義の動作が発生する可能性があります。たとえば、Out パラメータや Ref パラメータを介してポインタをローカル変数に返したり、関数の結果として返したりする場合です。ポインタが固定ブロックに設定されていた場合は、そのポインタが指す変数が既に固定されていない可能性があります。
次の表は、unsafe コンテキストでポインタに使用できる演算子とステートメントの一覧を示しています。
演算子/ステートメント |
用途 |
---|---|
* |
ポインタの間接参照を実行します。 |
-> |
ポインタ経由で構造体のメンバにアクセスします。 |
[] |
ポインタにインデックスを付けます。 |
& |
変数のアドレスを取得します。 |
++ および -- |
ポインタをインクリメントおよびデクリメントします。 |
+ および - |
ポインタ演算を実行します。 |
==、!=、<、>、<=、および >= |
ポインタを比較します。 |
stackalloc |
スタックにメモリを割り当てます。 |
fixed ステートメント |
変数を一時的に固定して、そのアドレスを取得できるようにします。 |
C# 言語仕様
詳細については、「C# 言語仕様」の以下のセクションを参照してください。
- 18 アンセーフ コード
参照
概念
参照
unsafe コードとポインタ (C# プログラミング ガイド)
ボックス化とボックス化解除 (C# プログラミング ガイド)