1

次のようなC#ソースコードのスニペットに遭遇しました

int* ptr = ...;
int  w = ...;

int* ptr3 = ptr + (IntPtr)w;

CS0019: Operator '+' cannot be applied to operands of type 'int*' and 'System.IntPtr'

このコードは、OSに依存するwによってptrアドレスを前方に移動しようとしていたと思います。これは正しいですか?また、このコードをコンパイルするにはどうすればよいですか?

4

2 に答える 2

3

ポインターを使用する場合は、コードを unsafe { } でラップし、プロジェクト プロパティで allow unsafe スイッチをオンにする必要があります

ここに画像の説明を入力

unsafe 
{
  //pointer code here
}
于 2012-12-23T05:24:09.137 に答える
2

いいえ、正しい構文ではありません。あなたが達成しようとしていることは非常に不明確なので、ここで推測してください。ポインターを "w" ints だけ前方に移動する場合は、次を使用します。

  int* ptr3 = ptr + w;

int は 4 バイトであるため、ポインター値に 4*w を追加します。これは、int の配列へのポインタとして ptr3 を扱うことと同じです。ここで、w は配列要素のオフセットです。そして、C 言語がポインタを扱う方法。

アドレスを w だけインクリメントするつもりだった場合は、IntPtr を使用しないでください。CLR では許可されていても、C# 言語では IntPtr での + 演算子の使用が禁止されています。代わりに、いくつかのキャストを行う必要があります。

  int* ptr3 = (int*)((byte*)ptr + w);
于 2012-12-23T08:23:01.053 に答える