Преобразования в типы указателей и из типов указателейConversions to and from Pointer Types

Указатель на один тип значения можно преобразовать в указатель на другой тип.A pointer to one type of value can be converted to a pointer to a different type. Однако результат может оказаться неопределенным из-за требований к выравниванию, а также размеров различных типов в хранилище.However, the result may be undefined because of the alignment requirements and sizes of different types in storage. Указатель на один объект можно преобразовать в указатель на другой объект, тип которого требует менее строгого или такого же строгого выравнивания хранилища, и обратно без изменений.A pointer to an object can be converted to a pointer to an object whose type requires less or equally strict storage alignment, and back again without change.

Указатель на тип void можно преобразовать в указатель на любой тип и из указателя на любой тип без ограничений и потери данных.A pointer to void can be converted to or from a pointer to any type, without restriction or loss of information. Если результат преобразуется обратно в исходный тип, восстанавливается исходный указатель.If the result is converted back to the original type, the original pointer is recovered.

Если указатель преобразуется в другой указатель того же типа, но с другими или дополнительными квалификаторами, новый указатель совпадает со старым, за исключением ограничений, накладываемых новыми квалификаторами.If a pointer is converted to another pointer with the same type but having different or additional qualifiers, the new pointer is the same as the old except for restrictions imposed by the new qualifier.

Значение указателя можно также преобразовать в целочисленное значение.A pointer value can also be converted to an integral value. Путь преобразования зависит от размера указателя и размера целочисленного типа согласно следующим правилам.The conversion path depends on the size of the pointer and the size of the integral type, according to the following rules:

  • Если размер указателя больше или равен размеру целочисленного типа, указатель ведет себя подобно беззнаковому значению в преобразовании, за исключением того, что он не может быть преобразован в значение с плавающей запятой.If the size of the pointer is greater than or equal to the size of the integral type, the pointer behaves like an unsigned value in the conversion, except that it cannot be converted to a floating value.

  • Если размер указателя меньше размера целочисленного типа, он сначала преобразуется в указатель того же размера, как у целочисленного типа, а затем в целочисленный тип.If the pointer is smaller than the integral type, the pointer is first converted to a pointer with the same size as the integral type, then converted to the integral type.

И наоборот, целочисленный тип можно преобразовать в тип указателя согласно следующим правилам.Conversely, an integral type can be converted to a pointer type according to the following rules:

  • Если размер целочисленного типа совпадает с размером типа указателя, преобразование просто приводит к обработке целочисленного значения как указателя (целого числа без знака).If the integral type is the same size as the pointer type, the conversion simply causes the integral value to be treated as a pointer (an unsigned integer).

  • Если размер целочисленного типа отличается от размера типа указателя, сначала целочисленный тип преобразуется в размер указателя по алгоритмам преобразования, которые указаны в таблицах Преобразование из целочисленных типов со знаком и Преобразование из целочисленных типов без знака, аIf the size of the integral type is different from the size of the pointer type, the integral type is first converted to the size of the pointer, using the conversion paths given in the tables Conversion from Signed Integral Types and Conversion from Unsigned Integral Types. затем рассматривается как значение указателя.It is then treated as a pointer value.

Константное целочисленное выражение со значением 0 или аналогичное выражение, приведенное к типу void *, можно преобразовать в указатель любого типа путем приведения типов, присваивания или сравнения.An integral constant expression with value 0 or such an expression cast to type void * can be converted by a type cast, by assignment, or by comparison to a pointer of any type. При этом создается пустой указатель, равный другому пустому указателю того же типа, но не равный любому указателю на функцию или объект.This produces a null pointer that is equal to another null pointer of the same type, but this null pointer is not equal to any pointer to a function or to an object. Целые числа, отличные от константы 0, можно преобразовать в тип указателя, но результат будет непереносимым.Integers other than the constant 0 can be converted to pointer type, but the result is not portable.

См. такжеSee also

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