Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
      1. Спецификаторы типа

Любой объявляемый объект должен иметь тип, определяемый одним или несколькими спецификаторами типа. Спецификаторы типа могут иметь следующий вид:

  • последовательность спецификаторов встроенного (фундаментального) типа.

  • имя перечисления.

  • typedef-имя.

      1. Использование спецификаторов

В объявлении спецификаторы могут быть записаны в любом порядке. Обычно программисты придерживаются одного из двух следующих форматов:

  • спецификаторы класса памяти, квалификаторы типа, спецификаторы типа.

  • спецификаторы класса памяти, спецификаторы типа, квалификаторы.

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

    1. Описатели

Основным элементом каждого описателя является объявляемое имя. Этот элемент является обязательным. Кроме того, в объявитель может входить дополнительная информация, относящаяся к типу. В состав дополнительных компонентов могут входить классификаторы типа и некоторые операторы языка Си:

* - оператор разыменования (для объявления указателей см. пункты 17 и 38).

() – оператор функция (для объявления функций см. пункт 37).

[] – оператор индексирования (для объявления массивов см. пункт 39).

Оператор * в объявителе используется (по отношению к объявляемому имени) в качестве префикса, а операторы () и [] – в качестве суффикса. Можно провести некоторую аналогию между использованием операторов в объявителях и выражениях. Суффиксные операторы «сильнее» связаны с именем, чем префиксные.

Приведем примеры объявлений, В комментариях использованы следующие сокращения: ПС – послеовательность спецификаций, СО – список объявителей.

int n, m; // ПС – спецификатор типа int, СО – два идентификатора перемен // ных: n и m double *px; // ПС – спецификатор типа double, СО – идентификатор переменной // px и префиксный оператор разыменования *

    1. Использование зарезервированного слова typedefдля объявления синонимов типов

Отметим, что typedefне позволяет объявлять новые типы. Его назначение состоит в том, чтобы назначать имя для уже существующего типа. В зависимости от вида существующего типа целесообразно различать три случая:

  • встроенный (фундаментальный) тип.

  • перечисление и структура.

  • все прочие типы; их характерной особенностью является отсутствие у типа имени.

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

Для перечислений и структур применение typedefпозволяет устранить из имени типа зарезервированное слово. Для перечислений таким именем являетсяenum, а для структур –struct.

Для всех оставшихся случаев применение рассматриваемого способа позволяет упростить структуру новых объявлений.

Приведем ряд примеров.

Пример 1. Синоним для встроенного типа. Рассмотрим некоторый фрагмент кода, в котором будет объявлен синоним (integer) для встроенного типаint.

typedef int integer;

После объявления этого синонима у программиста появляется альтернатива, существо которой состоит в том, что наряду с обычным именем типа int, он имеет возможность пользоваться новым именем.

int n; integer m;

Бессистемное использование этих двух альтернативных возможностей пользы не приносит. Смысл в объявлении синонима в том случае, когда программист откажется от стандартного имени int, и будет использовать альтернативноеinteger.

integer n, m;

При этом появляется возможность его оперативного изменения. Например, если окажется, что тип intследовало бы заменить другим типом. Например, типомdoubleint. такая замена может быть осуществлена редактированием объявления имениinteger.

typedef double intinteger; integer n, m;

Теперь переменные nиmимеют типdoubleint.

Пример 2. Синоним для типа, у которого нет своего имени. Обратимся к программному коду, приведенному ниже. В этом коде объявлен синоним ptr_dblдля существующего типаdouble*. Теперь программист имеет альтернативные возможности для объявления указателей на объекты типаdouble. Это и продемонстрировано в приведенном ниже коде.

typedef double* ptr_dbl; double *pb1; ptr_dbl pb2;