Явные преобразования указателей
Некоторые преобразования, затрагивающие указатели, допустимы, но имеют особенности, зависящие от реализации. Имеются в виду операции явного преобразования типа (см. пункт Унарные операции в разделе ВЫРАЖЕНИЯ И ОПЕРАЦИИ и пункт Имена типов в разделе ОПИСАНИЯ).
Указатель можно преобразовать в любой из целочисленных типов, достаточно большой, чтобы вместить его. Требуется ли int или long, зависит от конкретного компьютера. Отображающая функция также зависит от компьютера, но скорее всего не будет неожиданной для квалифицированного пользователя.
Объект целочисленного типа может быть явно преобразован в указатель. Отображение всегда переводит целое, полученное преобразованием из указателя, в тот же указатель; в остальном оно машинно-зависимо.
Указатель на объект одного типа можно преобразовать в указатель на объект другого типа. При использовании указателя-результата может произойти ошибка адресации, если исходный указатель не был должным образом выравнен. Гарантируется, что можно преобразовать указатель на объект некоторого размера в указатель на объект меньшего размера а затем обратно, без изменений.
Например, процедура выделения памяти получает размер (в байтах) объекта, который требуется разместить, и возвращает результат типа указатель на char; ее можно использовать так:
extern char *alloc (); double *dp; dp = (double *) alloc (sizeof (double)); *dp = 22.0 / 7.0;
Функция alloc() должна гарантировать (в смысле машинной зависимости), что возвращаемое значение можно преобразовать в указатель на double; тогда программа, описанным образом использующая эту функцию, будет мобильной.