2011-07-08 13 views
2

バイトの[]配列があるとします。配列へのポインタを作成して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)を逆参照したときの結果です。説明は?私は正しく鋳造の概念を理解していないかもしれません。

+0

Cで記述すると、キャストエラーのためにエラーが発生するコードを作成する方がはるかに簡単です。あなたの目標です。少ない皮肉(達成するのは難しくありません)では、なぜあなたはキャストしていますか? –

+0

基本的に私はこのチュートリアルを行ってきました:geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx –

+2

intへのポインタは、32ビットマシンで実行するのが分かりやすいものです。あなたが64ビットのプロセスを持っているなら、あなたは長くキャストしなければならないでしょう。 IntPtrへのキャストを検討することもできます。これは、ポインタと同じサイズであることが保証されている構造体です。 –

答えて

1

あなたのメモリは、次のようなものがレイアウトされている:

01 02 03 04 00 00 00 00 

pArrayBaseは、あなたの配列のベースアドレスに4バイトの整数を指しています。整数はリトルエンディアン形式で格納されるため、0x04030201という値になります。興味深いのは、pArrayBasePlus1を逆参照するときです。 pArrayBasePlus1は最初の4つに続く4バイトを指しています。 * pArrayBasePlus1が0である必要があります。

+0

ありがとう、私はエンディアンなどを参照する必要がありますはい、私のコードは少し間違っていた、あなたは正しい* pArrayBasePlus1はゼロです。 –