基本铸造问题(C#)

时间:2011-07-08 21:43:44

标签: c# pointers casting

假设我有一个byte []数组,我想知道当我创建指向数组的指针然后将其转换为int时我真正在做什么。当我取消引用所述int指针时,在下面的情况下我得到一个更大的数字:(代码可能有错误)

    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)的结果。有什么解释吗?我可能不理解正确铸造的概念。

1 个答案:

答案 0 :(得分:1)

你的记忆大致如下:

01 02 03 04 00 00 00 00

pArrayBase指向数组基址的四字节整数。由于整数以小端格式存储,因此结果为0x04030201。有趣的结果是当你取消引用pArrayBasePlus1时。 pArrayBasePlus1指向前四个后面的四个字节。除非你遗漏了一些代码,否则看起来* pArrayBasePlus1应为0。