Язык программирования 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