Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lektsii_po_si.doc
Скачиваний:
13
Добавлен:
12.11.2018
Размер:
11.78 Mб
Скачать

Структурный тип.

Структурный тип. Этот тип (производный агрегирующий) задает внутреннее строение определяемых с его помощью структур. Сказанное требует пояснений. Начнем с понятия структуры. Структура - это объединенное в единое целое множество поименованных элементов (компонентов) данных. В отличие от массива, всегда состоящего из однотипных элементов, компоненты структуры могут быть разных типов и все должны иметь различные имена. Например, может быть введена структура, описывающая товары на складе, с компонентами:

• название товара (char*);

• оптовая (закупочная) цена (long);

• торговая наценка в процентах (float);

• объем партии товара (int);

• дата поступления партии товара (char [9]).

В перечислении элементов структуры "товары на складе" добавлены выбранные программистом типы этих элементов. В соответствии со смыслом компоненты могут иметь любой из типов данных, допустимых в языке. Так как товаров на складе может быть много, для определения отдельных структур, содержащих сведения о конкретных товарах, программист вводит производный тип, называемый структурным. Для нашего примера его можно ввести, например, так:

Здесь struct - спецификатор структурного типа (служебное слово); goods - предложенное программистом название (имя) структурного типа. (Используя транслитерацию английского термина "tag", название структурного типа в русскоязычной литературе по языку Си довольно часто называют тегом.) В фигурных скобках размещаются описания элементов, которые будут входить в каждый объект типа goods. Итак, формат определения структурного типа таков:

struct имя_структурного_типа

{ определения_элементов };

где struct - спецификатор структурного типа;

имя_структурного_типа - идентификатор, произвольно выбираемый программистом;

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

Следует обратить внимание, что определение структурного типа (в отличие от определения функции) заканчивается точкой с запятой.

Конструкция struct имя_структурного_типа играет ту же роль, что и спецификаторы типов, например, double или int. С помощью struct goods можно либо определить конкретную структуру (как, например, объект структурного типа struct goods), либо указатель на структуры такого типа. Пример:

Кроме такого прямого определения поименованного структурного типа может быть введен безымянный структурный тип и не полностью определенный (незавершенный) структурный тип. О безымянном структурном типе речь пойдет в этом параграфе чуть позже при определении структур как объектов. Не полностью определенный, т.е. незавершенный структурный тип, потребуется в следующем параграфе при рассмотрении указателей на структуры, вводимые в качестве элементов структур. Кстати, отметим, что незавершенным может быть не только структурный тип. В общем смысле незавершенным считается любое определение, в котором не содержится достаточно информации о размере будущего объекта.

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

typedef struct {определения_элементов}

обозначение_структурного_типа;

Пример:

Приведенное определение вводит структурный тип struct {double real; double imag;} и присваивает ему обозначение (название, имя) complex. С помощью этого обозначения можно вводить структуры (объекты) так же, как с обычным именем структурного типа (например, struct goods в предыдущем примере). Пример:

Структурный тип, которому программист назначает имя с помощью typedef, может в то же время иметь второе имя, вводимое стандартным образом после служебного слова struct. В качестве примера введем определение структурного типа "рациональная дробь". Будем считать, что рациональная дробь -это пара целых чисел (m;n), где число n отлично от нуля. Определение такой дроби:

.

Здесь fraction - обозначение структурного типа, вводимое с помощью typedef. Имя rational_fraction введено для того же структурного типа стандартным способом. После такого определения структуры типа "рациональная дробь" могут вводиться как с помощью названия fraction, так и с помощью обозначения того же типа struct rational_fraction.

С помощью директивы #define можно вводить имена типов подобно тому, как это делается с помощью typedef. Например, сведения о книге могут быть введены таким образом:

Здесь BOOK - препроцессорный идентификатор, вслед за которым в нескольких строках размещена "строка замещения". Обратите внимание на использование символа продолжения '\' для переноса строковой константы. Кроме того, отметим отсутствие точки с запятой после закрывающей скобки '}'. Далее в программе можно определять конкретные объекты-структуры или указатели с помощью имени BOOK, введенного на препроцессорном уровне:

После препроцессорных замен и исключения комментариев это предложение примет вид (с точностью до размещения по строкам):

(Смотрите ниже определение структур и определение указателей на структуры.)