假设我有一个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)的结果。有什么解释吗?我可能不理解正确铸造的概念。
答案 0 :(得分:1)
你的记忆大致如下:
01 02 03 04 00 00 00 00
pArrayBase指向数组基址的四字节整数。由于整数以小端格式存储,因此结果为0x04030201。有趣的结果是当你取消引用pArrayBasePlus1时。 pArrayBasePlus1指向前四个后面的四个字节。除非你遗漏了一些代码,否则看起来* pArrayBasePlus1应为0。