Декларация структурного типа данных
Понятие структуры
Структуры и объединения
В реальных задачах информация, которую требуется обрабатывать, может иметь достаточно сложную структуру. Для ее адекватного представления используются типы данных, построенные на основе базовых типов данных, массивов и указателей. Языки высокого уровня позволяют программисту определять свои типы данных и правила работы с ними, т.е. типы, определяемые пользователем. В языке Си к ним относятся структуры, объединения и перечисления. Рассмотрим их более подробно.
Структура – это составной объект языка Си, представляющий собой совокупность логически связанных данных различных типов, объединенных в группу под одним идентификатором. Данные, входящие в эту группу, называют полями.
Определение объектов типа структуры производится за два шага:
– декларация структурного типа данных, не приводящая к выделению участка памяти;
– определение структурных переменных объявленного структурного типа с выделением для них памяти.
Структурный тип данных задается в виде шаблона, общий формат описания которого следующий:
struct ID структурного типа {
описание полей
};
Атрибут «ID структурного типа», т.е. ее идентификатор является необязательным и может отсутствовать.
Описание полей производится обычным способом: указываются типы и идентификаторы.
Пример определения структурного типа:
Необходимо создать шаблон, описывающий информацию о студенте: номер группы, ФИО и средний балл. Один из возможных вариантов:
struct Stud_type {
char Number[10];
char Fio[40];
double S_b;
};
Поля одного типа при описании можно объединять в одну группу:
struct Stud_type {
char Number[10], Fio[40];
double S_b;
};
Размещение данного объекта типа Stud_type в ОП схематически будет выглядеть следующим образом:
Number | Fio | S_b |
длина в байтах |
Структурный тип данных удобно применять для групповой обработки логически связанных объектов.
Иногда параметрами таких операций могут выступать адрес и размер (либо тип) структуры. Примеры подобных групповых операций:
- захват и освобождение памяти для объекта;
- запись и чтение данных, хранящихся на внешних носителях как физические и/или логические записи с известной структурой (при работе с файлами).
Т.к. одним из параметров групповой обработки структурных объектов является размер, нужно быть осторожным, если декларировать поле структуры как объект переменной размерности (например, как тип String), т.к. в этом случае "переменная" его часть будет храниться отдельно от остальной структуры, и некоторые операции со структурными данными будут не корректны, например:
struct Stud1 {
String Number, fio;
double S_b;
};
Хотя само такое определение структуры вполне допустимо, но не все операции со структурами, описанные ниже (например, запись целой структуры в файл), в применении к нему дадут верный результат.
Некоторые особенности:
1) поля структуры, как правило, имеют разный тип, кроме функций, файлов и самой этой структуры;
2) поля не могут иметь атрибут, указывающий «класс памяти», данный атрибут можно определить только для всей структуры;
3) идентификаторы (ID) как самой структуры, так и ее полей могут совпадать с ID других объектов программы, т.к. шаблон структуры обладает собственным пространством имен;
4) при наличии в программе функций пользователя шаблон структуры рекомендуется поместить глобально перед определениями всех функций, и в этом случае он будет доступен всем функциям.