Основной кастинг вопрос (C #) - PullRequest
2 голосов
/ 09 июля 2011

Предположим, у меня есть массив 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 Ответ

1 голос
/ 09 июля 2011

Ваша память выложена примерно так:

01 02 03 04 00 00 00 00

pArrayBase указывает на четырехбайтовое целое число по базовому адресу вашего массива. Поскольку целые числа хранятся в формате с прямым порядком байтов, это приводит к значению 0x04030201. Интересный результат, когда вы разыменовываете pArrayBasePlus1. pArrayBasePlus1 указывает на четыре байта, следующие за первыми четырьмя. Если вы не пропустили некоторый код, похоже, что * pArrayBasePlus1 должно быть 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...