Я ж говорю - упертый ты :) В приведенной выше упакованной структуре
(стандартном заголовке IP пакета) все поля натурально выровнены.
Т.е. uint16_t лежит по смещению, кратному двум, а uint32_t лежит по
смещению, кратному четырем. Так задумано изначально не самыми
глупыми людьми. Соответственно, если сама структура лежит по адресу
кратному четырем, то и все ее поля лежат как положено. И указатели
нормально можно брать и использовать. Упаковка нужна, чтобы особо
умные компиляторы не пытались uint16_t (или даже uint8_t на каких-нибудь TMS320 без байтовых операций) на 4 байта выравнивать. Ну а ежели кто-то приводит адрес uint8_t к указателю на char - то кто ему тогда доктор?