C#でポインタを利用する方法

/unsafeコンパイラオプションを使用してコンパイルすることで、C#のコード内でポインタを使用してメモリを操作することができるようになります。これはC言語のライブラリに対してアクセスするような場合に便利です。

ポインタ演算子
演算子 種類 説明
& address-of演算子 他のアドレスへのポインタを返す
* dereference演算子 ポインタのアドレスにある値を返す
-> pointer-to-member演算子 構文上のショートカットx->yは(*x).yに相当する

IntPtr構造体

IntPtr 構造体 (System) - MSDN

アンセーフコード (unsafe)

C言語形式のポインタを使用するためには、unsafeキーワードを使用してアンセーフなコードであることを宣言しなくてはなりません。この宣言はステートメントのブロックに対して行い、そのスコープ内で有効となります。

void Foo()
{
    int x;

    unsafe
    {
        int* y = &x;
    }
}

/unsafeコンパイラオプション

プロジェクトのプロパティで、ビルドにある「アンセーフ コードの許可」にチェックを入れます。

アンセーフコードの許可のチェックボックス

マネージオブジェクトのポインタ (fixedステートメント)

C#ではガベージコレクションによってメモリが自動で管理されています。そこにはメモリの断片化を防ぐためにオブジェクトを移動する機能がありますが、これによってメモリのアドレスが変更されると、そのオブジェクトのポインタは使用できなくなってしまいます。

fixedステートメントを使用すると、マネージオブジェクトのポインタを固定することができます。

fixed( int* a = &text.x )
{
    *a = 256;
}

配列とポインタ

MarshalクラスのCopyメソッドによって、マネージ配列とアンマネージポインタで相互にデータのコピーを行えます。Marshal.Copyメソッド - MSDN