次の方法で共有


ポインター型 (C# プログラミング ガイド)

unsafe コンテキストの型には、ポインター型、値型、または参照型を設定できます。 ポインター型の宣言は、次のいずれかの形式になります。

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

次の型はいずれもポインター型になります。

ポインター型は 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# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

参照

参照

unsafe コードとポインター (C# プログラミング ガイド)

ポインター変換 (C# プログラミング ガイド)

ポインター式 (C# プログラミング ガイド)

unsafe (C# リファレンス)

fixed ステートメント (C# リファレンス)

stackalloc (C# リファレンス)

ボックス化とボックス化解除 (C# プログラミング ガイド)

概念

C# プログラミング ガイド

その他の技術情報

型 (C# リファレンス)