На некоторых архитектурах указатель может быть больше, чем просто адрес. Изменение типа указателя может изменить его битовую комбинацию, даже если он не изменяет указанный адрес.

ущем проекте стандарта (и C ++ 17),это написано о static_castingvoid *:

Значение типа «указатель наCV1 void »можно преобразовать в значение типа« указатель наCV2 T ”, где T - тип объекта иCV2 является той же квалификацией cv или большей квалификацией, чемCV1, Если исходное значение указателя представляет адрес A байта в памяти и A не удовлетворяет требованию выравнивания T, то полученное значение указателя не определено. В противном случае, если исходное значение указателя указывает на объектaи есть объектb типа T (игнорируя cv-квалификацию), которая может быть преобразована в указательaрезультат - указатель наb, В противном случае значение указателя не изменяется при преобразовании.

Интересно, а какая разница, является ли преобразование взаимно конвертируемым или нет? Есть ли случай, когдаvoid * что-то взаимозаменяемое указатель на самом деле меняет значение указателя? Какова цель этого различия?

Для полнотывзаимозаменяемый указатель:

Два объекта a и b являются взаимозаменяемыми по указателю, если:

(4.1) это один и тот же объект, или(4.2) один является объектом объединения, а другой - нестатическим членом данных этого объекта ([class.union]), или(4.3) один является объектом класса стандартной компоновки, а другой - первым нестатическим членом данных этого объекта, или, если объект не имеет нестатических членов данных, любой подобъект базового класса этого объекта ([класс. mem]) или(4.4) существует объект c такой, что a и c являются взаимно конвертируемыми по указателю, а c и b являются взаимно конвертируемыми по указателю.

Если два объекта являются взаимозаменяемыми по указателю, то они имеют одинаковый адреси можно получить указатель на один из указателя на другой через reinterpret_cast.

Ответы на вопрос(2)

Ваш ответ на вопрос