Преобразования в типы указателей и из них
Указатель на один тип значения можно преобразовать в указатель на другой тип. Однако результат может оказаться неопределенным из-за требований к выравниванию, а также размеров различных типов в хранилище. Указатель на один объект можно преобразовать в указатель на другой объект, тип которого требует менее строгого или такого же строгого выравнивания хранилища, и обратно без изменений.
Указатель на тип void можно преобразовать в указатель на любой тип и из указателя на любой тип без ограничений и потери данных. Если результат преобразуется обратно в исходный тип, восстанавливается исходный указатель.
Если указатель преобразуется в другой указатель того же типа, но с другими или дополнительными квалификаторами, новый указатель совпадает со старым, за исключением ограничений, накладываемых новыми квалификаторами.
Значение указателя можно также преобразовать в целочисленное значение. Путь преобразования зависит от размера указателя и размера целочисленного типа согласно следующим правилам.
Если размер указателя больше или равен размеру целочисленного типа, указатель ведет себя подобно беззнаковому значению в преобразовании, за исключением того, что он не может быть преобразован в значение с плавающей запятой.
Если размер указателя меньше размера целочисленного типа, он сначала преобразуется в указатель того же размера, как у целочисленного типа, а затем в целочисленный тип.
И наоборот, целочисленный тип можно преобразовать в тип указателя согласно следующим правилам.
Если размер целочисленного типа совпадает с размером типа указателя, преобразование просто приводит к обработке целочисленного значения как указателя (целого числа без знака).
Если размер целочисленного типа отличается от размера типа указателя, он сначала преобразуется в размер указателя с использованием путей преобразований, указанных в таблицах Преобразование из целочисленных типов со знаком и Преобразование из целочисленных типов без знака, а затем рассматривается как значение указателя.
Константное целочисленное выражение со значением 0 или такое выражение, приведенное к типу void *, можно преобразовать путем приведения типов, присваивания или сравнения с указателем любого типа. При этом создается пустой указатель, равный другому пустому указателю того же типа, но не равный любому указателю на функцию или объект. Целые числа, отличные от константы 0, можно преобразовать в тип указателя, но результат будет непереносимым.