/unsafeコンパイラオプションを使用してコンパイルすることで、C#のコード内でポインタを使用してメモリを操作することができるようになります。これはC言語のライブラリに対してアクセスするような場合に便利です。
| 演算子 | 種類 | 説明 |
|---|---|---|
| & | address-of演算子 | 他のアドレスへのポインタを返す |
| * | dereference演算子 | ポインタのアドレスにある値を返す |
| -> | pointer-to-member演算子 | 構文上のショートカットx->yは(*x).yに相当する |
C言語形式のポインタを使用するためには、unsafeキーワードを使用してアンセーフなコードであることを宣言しなくてはなりません。この宣言はステートメントのブロックに対して行い、そのスコープ内で有効となります。
void Foo()
{
int x;
unsafe
{
int* y = &x;
}
}
プロジェクトのプロパティで、ビルドにある「アンセーフ コードの許可」にチェックを入れます。

C#ではガベージコレクションによってメモリが自動で管理されています。そこにはメモリの断片化を防ぐためにオブジェクトを移動する機能がありますが、これによってメモリのアドレスが変更されると、そのオブジェクトのポインタは使用できなくなってしまいます。
fixedステートメントを使用すると、マネージオブジェクトのポインタを固定することができます。
fixed( int* a = &text.x )
{
*a = 256;
}
MarshalクラスのCopyメソッドによって、マネージ配列とアンマネージポインタで相互にデータのコピーを行えます。Marshal.Copyメソッド - MSDN