Язык С


         

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


Разрешаются определенные преобразования, с использовани- ем указателей , но они имеют некоторые зависящие от конкрет- ной реализации аспекты. Все эти преобразования задаются с помощью операции явного преобразования типа; см. П. 15.2 и 16.7. Указатель может быть преобразован в любой из целочислен- ных типов, достаточно большой для его хранения. Требуется ли при этом INT или LONG, зависит от конкретной машины. Преоб- разующая функция также является машинно-зависимой, но она будет вполне естественной для тех, кто знает структуру адре- сации в машине. Детали для некоторых конкретных машин приво- дятся ниже. Объект целочисленного типа может быть явным образом пре- образован в указатель. такое преобразование всегда переводит преобразованное из указателя целое в тот же самый указатель, но в других случаях оно будет машинно-зависимым.

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

EXTERN CHAR *ALLOC(); DOUBLE *DP; DP=(DOUBLE*) ALLOC(SIZEOF(DOUBLE)); *DP=22.0/7.0;

Функция ALLOC должна обеспечивать (машинно-зависимым спосо- бом), что возвращаемое ею значение будет подходящим для пре- образования в указатель на DOUBLE; в таком случае использо- вание этой функции будет переносимым. Представление указателя на PDP-11 соответствует 16-бито- вому целому и измеряется в байтах. Объекты типа CHAR не име- ют никаких ограничений на выравнивание; все остальные объек- ты должны иметь четные адреса. На HONEYWELL 6000 указатель соответствует 36-битовому целому; слову соответствует 18 левых битов и два непосредст- венно примыкающих к ним справа бита, которые выделяют символ в слове. Таким образом, указатели на символы измеряются в единицах 2 в степени 16 байтов; все остальное измеряется в единицах 2 в степени 18 машинных слов. Величины типа DOUBLE и содержащие их агрегаты должны выравниваться по четным ад- ресам слов (0 по модулю 2 в степени 19). Эвм IBM 370 и INTERDATA 8/32 сходны между собой. На обеих машинах адреса измеряются в байтах; элементарные объекты должны быть выров- нены по границе, равной их длине, так что указатели на SHORT должны быть кратны двум, на INT и FLOAT - четырем и на DOUBLE - восьми. Агрегаты выравниваются по самой строгой границе, требуемой каким-либо из их элементов.



    Содержание  Назад  Вперед