По определению, char
занимает один байт памяти, поэтому, если вы хотите выполнить вычисления адреса на основе размеров байтов, используйте char *
.В то время как стандарт C требует, чтобы void *
имел то же представление, что и char *
, void *
не несет информации о размере и поэтому не может использоваться для арифметики указателей.
Если вы действительно хотите получить вбиты представления объекта, используйте unsigned char
, поскольку char
может быть подписано и не указано, что оно не содержит отступов.
Теперь, комментарий к ответ Джонатона :
В то время как целочисленные типы фиксированной ширины из stdint.h
также не содержат отступов, и вы можете использовать их, как описано для определенных архитектур (нет ничего плохого в коде для конкретной платформы, если вам не нужно быть переносимым), вВ общем, вы знаете только их ширину в битах, а не их размеры в байтах, поскольку CHAR_BIT
может отличаться от 8 (16 и 32 являются «общими» для некоторых частей встроенного мира).Тем не менее, байт == октет требуется для систем POSIX.
Целочисленные типы фиксированной ширины определенных размеров не должны существовать: в частности, если CHAR_BIT
не является степенью 2 (да,такие архитектуры существуют), ни один из типов uint8_t
, uint16_t
, uint32_t
, uint64_t
не может существовать