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

Язык С
Строк программы, исключая математическое обеспечение Является учебным введением в центральную часть языка “C” Hачинаем. Единственный способ освоить новый язык Оператор FOR Набор полезных программ Подсчет символов Подсчет слов Функции Аргументы - вызов по значению Область действия: внешние переменные Резюме Константы Описания Преобразование типов До 9 и буквы от а до F Операции и выражения присваивания Старшинство и порядок вычисления Операторы и блоки Переключатель Цикл DO - WHILE Оператор CONTINUE Основные сведения Функции, возвращающие нецелые значения Еще об аргументах функций Правила, определяющие область действия Статические переменные Блочная структура Рекурсия Указатели и адреса Указатели и массивы Адресная арифметика Указатели символов и функции Указатели - не целые До 12, а не от 0 до 11. Так как за экономию памяти у нас пока не награждают, такой способ проще, чем подгонка индек-сов Инициализация массивов указателей Указатели на функции Структуры Структуры и функции Указатели на структуры Мы продемонстрируем, как правильно выполнить эту задачу Поля Определение типа Обращение к стандартной библиотеке Форматный вывод - функция PRINTF Форматный ввод - функция SCANF Форматное преобразование в памяти Обработка ошибок - STDERR и EXIT Обращение к системе Низкоуровневый ввод/вывод - операторы READ и WRITE Произвольный доступ - SEEK и LSEEK Пример - распечатка справочников Пример - распределитель памяти Константы Синтаксическая нотация Преобразования Первичные выражения Унарные операции Аддитивные операции Операция присваивания Спецификаторы типа Описание структур и объединений Инициализация TYPEDEF Оператор SWITCH Внешнее определение функции Область действия внешних идентификаторов Неявные описания Явные преобразования указателей Анахронизмы Операторы
439386
знаков
0
таблиц
0
изображений

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

Разрешаются определенные преобразования, с использовани-

ем указателей , но они имеют некоторые зависящие от конкрет-

ной реализации аспекты. Все эти преобразования задаются с

помощью операции явного преобразования типа; см. П. 15.2 и

16.7.

Указатель может быть преобразован в любой из целочислен-

ных типов, достаточно большой для его хранения. Требуется ли

при этом INT или LONG, зависит от конкретной машины. Преоб-

разующая функция также является машинно-зависимой, но она

будет вполне естественной для тех, кто знает структуру адре-

сации в машине. Детали для некоторых конкретных машин приво-

дятся ниже.

Объект целочисленного типа может быть явным образом пре-

образован в указатель. такое преобразование всегда переводит

преобразованное из указателя целое в тот же самый указатель,

но в других случаях оно будет машинно-зависимым.


·     221 -

Указатель на один тип может быть преобразован в указа-

тель на другой тип. Если преобразуемый указатель не указыва-

ет на объекты, которые подходящим образом выравнены в памя-

ти, то результирующий указатель может при использовании вы-

зывать ошибки адресации. Гарантируется, что указатель на

объект заданного размера может быть преобразован в указатель

на объект меньшего размера и снова обратно, не претерпев при

этом изменения.

Например, процедура распределения памяти могла бы прини-

мать запрос на размер выделяемого объекта в байтах, а возв-

ращать указатель на символы; это можно было бы использовать

следующим образом.

 

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 - восьми. Агрегаты выравниваются по самой строгой

границе, требуемой каким-либо из их элементов.

23. Константные выражения

В нескольких местах в языке “C” требуются выражения, ко-

торые после вычисления становятся константами: после вариан-

тного префикса CASE, в качестве границ массивов и в инициа-

лизаторах. В первых двух случаях выражение может содержать

только целые константы, символьные константы и выражения

SIZEOF, возможно связанные либо бинарными операциями

 

+ - * / . % & \! Ч << >> == 1= <> <= >=

либо унарными операциями

 - \^

 

либо тернарной операцией ?:

·    
222 -

Круглые скобки могут использоваться для группировки, но не

для обращения к функциям.

 

В случае инициализаторов допускается большая (ударение

на букву о) свобода; кроме перечисленных выше константных

выражений можно также применять унарную операцию & к внешним

или статическим объектам и к внешним или статическим масси-

вам, имеющим в качестве индексов константное выражение.

Унарная операция & может быть также применена неявно, в ре-

зультате появления неиндексированных массивов и функций. Ос-

новное правило заключается в том, что после вычисления ини-

циализатор должен становится либо константой, либо адресом

ранее описанного внешнего или статического объекта плюс или

минус константа.

24. Соображения о переносимости

Некоторые части языка “C” по своей сути машинно-зависи-

мы. Следующие ниже перечисление потенциальных трудностей хо-

тя и не являются всеобъемлющими, но выделяет основные из

них.

Как показала практика, вопросы, целиком связанные с ап-

паратным оборудованием, такие как размер слова, свойства

плавающей арифметики и целого деления, не представляют осо-

бенных затруднений. Другие аспекты аппаратных средств нахо-

дят свое отражение в различных реализациях. Некоторые из

них, в частности, знаковое расширение (преобразующее отрица-

тельный символ в отрицательное целое) и порядок, в котором

помещаются байты в слове, представляют собой неприятность,

которая должна тщательно отслеживаться. Большинство из ос-

тальных проблем этого типа не вызывает сколько-нибудь значи-

тельных затруднений.

Число переменных типа REGISTER, которое фактически может

быть помещено в регистры, меняется от машины к машине, также

как и набор допустимых для них типов. Тем не менее все ком-

пиляторы на своих машинах работают надлежащим образом; лиш-

ние или недопустимые регистровые описания игнорируются.

Некоторые трудности возникают только при использовании

сомнительной практики программирования. Писать программы,

которые зависят от каких- либо этих свойств, является чрез-

вычайно неразумным.

Языком не указывается порядок вычисления аргументов фун-

кций; они вычисляются справа налево на PDP-11 и VAX-11 и

слева направо на остальных машинах. порядок, в котором про-

исходят побочные эффекты, также не специфицируется.

Так как символьные константы в действительности являются

объектами типа INT, допускается использование символьных

констант, состоящих из нескольких символов. Однако, посколь-

ку порядок, в котором символы приписываются к слову, меняет-

ся от машины к машине, конкретная реализация оказывается

весьма машинно-зависимой.

Присваивание полей к словам и символов к целым осуществ-

ляется справо налево на PDP-11 и VAX-11 и слева направо на

других машинах. эти различия незаметны для изолированных

программ, в которых не разрешено смешивать типы (преобразуя,

например, указатель на INT в указатель на CHAR и затем про-

веряя указываемую память), но должны учитываться при согла-

совании с накладываемыми извне схемами памяти.


·     223 -

Язык, принятый на различных компиляторах, отличается

только незначительными деталями. Самое заметное отличие сос-

тоит в том, что используемый в настоящее время компилятор на

PDP-11 не инициализирует структуры, которые содержат поля

битов, и не допускает некоторые операции присваивания в оп-

ределенных контекстах, связанных с использованием значения

присваивания.


Информация о работе «Язык С»
Раздел: Информатика, программирование
Количество знаков с пробелами: 439386
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
48443
0
0

... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...

Скачать
43709
0
0

... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...

Скачать
39778
0
1

... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...

Скачать
64931
0
0

... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...

0 комментариев


Наверх