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