Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
13_структуры_производные_типы_данных.pdf
Скачиваний:
9
Добавлен:
16.03.2016
Размер:
697.68 Кб
Скачать

Язык программирования Cи

ТЕМА 13 СТРУКТУРЫ – ПРОИЗВОДНЫЕ ТИПЫ ДАННЫХ

Рассматриваются вопросы создания и использования структур в языке программирования С.

1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

Структура – это совокупность нескольких переменных, часто различных типов [1], объединяемых под одним именем. Переменные, из которых состоит структура, называются ее членами, элементами или полями [2]. С помощью структур удобно размещать в смежных полях связанные между собой элементы информации. Здесь могут быть собраны различные объекты – переменные, массивы, указатели, другие структуры и т. д. Если в массиве представлены переменные одного типа (например, float), то в структуре могут наличествовать переменные различных типов. Объявление структуры подготавливает шаблон, который можно использовать для создания ее объектов (экземпляров этой структуры) [2]. При объявлении структуры определяется агрегатный тип данных, но не переменная.

Определение структуры состоит из двух шагов:

1)объявление шаблона структуры (задание нового типа данных);

2)определение переменных типа объявленного шаблона [3].

Имена шаблонов должны быть уникальными в пределах области их определения, для

того чтобы компилятор мог различать их типы. Задание шаблона осуществляется с помощью ключевого слова struct, за которым следуют его имя и список элементов, заключенных в фигурные скобки [3]. Имена элементов в одном шаблоне также должны быть уникальными. Задание только шаблона не влечет резервирования памяти компилятором. Шаблон предоставляет компилятору необходимую информацию об элементах структурной переменной для выделения места в оперативной памяти и организации доступа к ней при определении структурной переменной и использовании ее отдельных элементов [3].

Рассмотрим шаблон структуры для определения имени и фамилии работника (служащего – employee), его возраста, почасовой оплаты:

struct employee

{

char Name [21];

// имя

char Surname [21];

// фамилия

int age;

//

возраст

double hourlysalary;

//

почасовой оклад

};

Как видно, шаблон структуры struct employee состоит из символьных массивов типа char, целого числа типа int и числа с плавающей точкой двойной точности типа double. Описание элементов производится в фигурных скобках, после закрывающей скобки обязательна точка с запятой.

Определение структуры начинается с ключевого слова struct. Идентификатор employee является именем-этикеткой (tag name), дескриптором, именует структуру и используется совместно с ключевым словом struct для объявления переменных структурного типа [4].

Переменные структуры объявляются так же, как и переменные других типов. На основе приведенного шаблона сделаем несколько объявлений новых структурных переменных:

struct employee new_ employee, * employeePtr, stack[120];

Здесь new_employee – переменная типа struct employee, *employeePtr – ука-

затель на struct employee, stack[120] – массив из 120 элементов типа struct employee.

Переменные new_employee, *employeePtr, stack[102] могут быть объединены с определением структуры, а именно:

struct employee

{

1

 

Язык программирования Cи

char Name [20+1];

// имя

char Surname [20+1];

// фамилия

int age;

// возраст

double hourlysalary;

// почасовой оклад

}new_employee, *employeePtr, stack[120];

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

При создании структур часто используется ключевое слово typedef (оператор). Оно предоставляет программисту средство создания синонимов (или псевдонимов) для ранее определенных типов данных. К нему часто обращаются для того, чтобы дать укороченное имя структурному типу [4]. Например, оператор вида

typedef struct card Card;

определяет новый тип с именем Card как синоним типа struct card.

Ключевое слово typedef может быть использовано в определении типа структуры

без имени-этикетки. Например,

 

typedef struct

 

{

 

char *Name;

// имя

char *Surname;

// фамилия

int age;

// возраст

double hourlysalary;

// почасовой оклад

} Man;

 

создает тип Man без использования отдельного оператора typedef. В данном примере необходимо предусмотреть выделение памяти под символьные указатели.

Созданный тип Man можно использовать для объявления структурных переменных типа struct employee, например

Man stack[120];

П р и м е ч а н и е . Использование typedef помогает сделать программу более переносимой.

Синтаксис инициализации структур аналогичен инициализации массивов. Например, выполним инициализацию структуры:

struct employee {

 

char Name [20+1];

// имя

char Surname [20+1];

// фамилия

int age;

// возраст

double hourlysalary;

// почасовой оклад

} new_employee;

 

Возможный вариант инициализации: struct employee

{

char Name [20];

// имя

char Surname [20];

// фамилия

int age;

//

возраст

double hourlysalary;

//

почасовой оклад

}new_employee = { "Peter", "Smith", 25, 6.78 };

При инициализации структуры ее элементы (инициализаторы) должны соответствовать заданному типу и отделяться друг от друга запятыми.

Доступ к элементам (компонентам, полям) структуры осуществляется двумя спосо-

бами:

1)с помощью оператора связывающей точки (оператора точки) . при непосредственной работе со структурой;

2)с помощью стрелки –> при использовании указателей на структуры.

2