void * будет иметь такое же представление и выравнивание памяти как указатель на char

Я читаю книгу по указателям под названием « понимание и использование cуказателей »

Когда дело доходит до void * это говорит

Он обладает двумя интересными свойствами:

  1. Указатель на void будет иметь такое же представление и выравнивание памяти как указатель на char.

Что смущает, так это не память всех указателей? Они почему вместо того, чтобы писать void *, то же самое, что и обычный указатель, он явно упоминает указатели на символы? Будем очень благодарны за любую помощь

На большинстве распространенных архитектур указатель на любой тип данных имеет одинаковое представление, в то время как указатель на функцию может отличаться. Однако это не является обязательным требованием, поэтому можно создать действительную реализацию C, которая использует разные указатели для разных типов данных. Причина этого заключается в том, что стандарт C обычно описывает только критические требования, оставляя большую свободу для возможных реализаций. Вот какой стандарт говорит:

Указатель на void должен иметь те же требования к представлению и выравниванию, что и указатель на тип символа. Точно так же указатели на квалифицированные или неквалифицированные версии совместимых типов должны иметь одинаковые требования к представлению и выравниванию. Все указатели на типы структуры должны иметь одинаковые требования к представлению и согласованию друг с другом. Все указатели на типы объединения должны иметь одинаковые требования к представлению и согласованию друг с другом. Указатели на другие типы не должны иметь одинаковые требования к представлению или выравниванию.

Если вам любопытно видеть примеры систем разного размера для разных типов данных, в этом вопросе упоминаются эти замечательные примеры

Я думаю, что здесь речь идет о «выравнивании памяти», а не «размере памяти».

Да, все указатели имеют одинаковый размер памяти. Но они могут иметь разные ограничения для выравнивания памяти.

Например, на некоторых платформах указатель «32-разрядный int» должен указывать на адрес, который должен быть в 4 байта. Он не может указывать на, например, 0x100001 или 0x100003.

Но указатель «8-разрядный символ» может указывать на любой адрес. То же самое делает и указатель «void».

Поэтому он сказал это.