バイトの[]配列があるとします。配列へのポインタを作成してintにキャストするとき、私が実際に何をしているのか疑問に思っています。 Iは前記INTポインタ間接参照、Iは蛇腹場合に大きな数を取得する場合:(コードがエラーを有していてもよい)基本的なキャスティングの質問(C#)
byte[] bytes = new byte[100];
bytes[0] = 1;
bytes[1] = 2;
bytes[2] = 3;
bytes[3] = 4;
fixed (byte* pMem = &bytes[0])
{
Debug.WriteLine("{0:x16}", (int)pMem);
byte* pMemPlus1 = pMem + 1;
Debug.WriteLine("{0:x8}", *pMemPlus1);
byte* pMemPlus2 = pMem + 2;
Debug.WriteLine("{0:x16}", *pMemPlus2);
int* pArrayBase = (int*) pMem;
Debug.WriteLine("{0:x8}", *pArrayBase);
int* pArrayBasePlus1 = pArrayBase+1;
Debug.WriteLine("{0:x8}", *pArrayBasePlus1;
}
右予想通り、PMEM、PMemPlus1とPMemPlus2間接参照ので1,2および3に( int)pMem私が取るのはポインタ(メモリアドレス)の値です。
intポインタとしてキャストされている場合、pArrayBaseは4030201を与え、pArrayBasePlus1は4を返します。後者は、intが4バイト長であるため正しいです。しかし、私は理解していません。私がint-cast配列ポインタ(pArrayBase)を逆参照したときの結果です。説明は?私は正しく鋳造の概念を理解していないかもしれません。
Cで記述すると、キャストエラーのためにエラーが発生するコードを作成する方がはるかに簡単です。あなたの目標です。少ない皮肉(達成するのは難しくありません)では、なぜあなたはキャストしていますか? –
基本的に私はこのチュートリアルを行ってきました:geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx –
intへのポインタは、32ビットマシンで実行するのが分かりやすいものです。あなたが64ビットのプロセスを持っているなら、あなたは長くキャストしなければならないでしょう。 IntPtrへのキャストを検討することもできます。これは、ポインタと同じサイズであることが保証されている構造体です。 –