Поделиться через


Преобразования в типы указателей и из типов указателей

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

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

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

Значение указателя можно также преобразовать в целочисленное значение. Путь преобразования зависит от размера указателя и размера целочисленного типа согласно следующим правилам.

  • Если размер указателя больше или равен размеру целочисленного типа, указатель ведет себя как неподписаемое значение при преобразовании, за исключением того, что его нельзя преобразовать в плавающее значение.

  • Если размер указателя меньше размера целочисленного типа, он сначала преобразуется в указатель того же размера, как у целочисленного типа, а затем в целочисленный тип.

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

  • Если размер целочисленного типа совпадает с размером типа указателя, преобразование просто приводит к обработке целочисленного значения как указателя (целого числа без знака).

  • Если размер целочисленного типа отличается от размера типа указателя, сначала целочисленный тип преобразуется в размер указателя по алгоритмам преобразования, которые указаны в таблицах Преобразование из целочисленных типов со знаком и Преобразование из целочисленных типов без знака, а Затем он обрабатывается как значение указателя.

Константное целочисленное выражение со значением 0 или аналогичное выражение, приведенное к типу void*, можно преобразовать в указатель любого типа путем приведения типов, присваивания или сравнения. Эта операция создает пустой указатель, который равен другому указателю NULL того же типа, но не равен ни одному указателю на функцию или объект. Целые числа, отличные от константы 0, можно преобразовать в тип указателя, но результат не является переносимым.

См. также

Преобразования назначений