Когда я увидел эти строки:
BYTE MessageToProcess[MAX_MESSAGE_LENGTH];
TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)&MessageToProcess;
Я сказал себе, что вторая строка должна быть такой:
TcpIpPacketHdr *pHdr = (TcpIpPacketHdr*)MessageToProcess;
Но когда я проверил в режиме отладки, "pHdr" указывает на то же, что и "MessageToProcess" в обоих примерах, тогда как "&" перед MessageToProcess в первом коде, поэтому обычно pHdr должен содержать адрес MessageToProcess, а не адрес байта, который указывает, например, на первый элемент в messageToProcess.
Итак, вопрос Что происходит? мы имеем дело с указателями на байты, а не с функциями, поэтому добавляем и должны изменять уравнение.
Позже в коде мы используем pHdr следующим образом:
pHdr->size+2
Но сначала в первом коде он содержит адрес указателя, удерживающего адрес в первом байте массива.