Декларация структурного типа данных
Структуры
Краткие теоретические сведения
Программирование алгоритмов с использованием структур
Структура - это составной объект языка Си, представляющий собой совокупность логически связанных данных различного типа, объединенных в группу под одним идентификатором. Данные, входящие в эту группу, называют полями.
Термин «структура» в языке С/C++ соответствует двум разным по смыслу понятиям:
структура – это обозначение участка оперативной памяти, где располагаются конкретные значения данных; в дальнейшем – это структурная переменная, поля которой располагаются в смежных областях памяти;
структура – это правила формирования структурной переменной, которыми руководствуется компилятор при выделении ей места в памяти и организации доступа к ее полям.
Определение объектов типа структуры производится за два шага:
- декларация структурного типа данных, не приводящая к выделению участка памяти;
- определение (создание) структурных переменных с выделением памяти.
Структурный тип данных задается в виде шаблона, общий формат
описания которого следующий:
struct имя_структуры
{
описание полей;
};
Имя структуры, т.е. ее идентификатор, является необязательным и может отсутствовать.
Описание полей производится обычным способом, ограничений на тип элементов нет.
Пример определения структурного типа - необходимо создать шаблон, описывающий информацию о студенте: номер группы, Ф.И.О. и средний балл. Один из возможных вариантов:
struct Stud_type
{
char Number[10];
char Fio[40];
double S_b;
};
Интерпретация объекта типа struct person:
Number | Fio | S_b |
длина в байтах
Структурный тип данных удобно применять для групповой обработки логически связанных объектов. Параметрами таких операций являются адрес и размер структуры.
Примеры групповых операций:
захват и освобождение памяти для объекта;
запись и чтение данных, хранящихся на внешних носителях как физические и/или логические записи с известной структурой (при работе с файлами).
Так как одним из параметров групповой обработки структурных объектов является размер, не рекомендуется декларировать поле структуры указателем на объект переменной размерности, поскольку в данном случае многие операции со структурными данными будут некорректны.
Как уже отмечалось, само описание структуры не приводит к выделению под нее места в памяти. Теперь необходимо создать нужное количество переменных с приведенной структурой и сделать это можно двумя способами.
Способ 1. В любом месте программы для декларации структурных переменных, массивов, функций и т.д. используется объявленный в шаблоне структурный тип, например:
struct Stud_type student; - структурная переменная;
Stud_type Stud[100]; - массив структур
Stud_type *p_stud; - указатель на структуру
Stud_type* Fun(Stud_type); - прототип функции с параметром структурного типа, возвращающей указатель на объект структурного типа.
Способ 2. В шаблоне структуры между закрывающейся фигурной скобкой и символом «;» указывают через запятые идентификаторы структурных данных.
Для нашего примера можно записать:
struct Stud_type
{
char Number[10], Fio[40];
double S_b;
} student, Stud[100], *p_stud;
Если дальше в программе не понадобится вводить новые данные объявленного структурного типа, Stud_type можно не указывать.
При декларации структурных переменных возможна их одновременная инициализация, например:
struct Stud_type
{
char Number[10], Fio[40];
double S_b;
} student = {“123456”, “Иванов И.И.”, 6.53 };
или
Stud_Type stud1 = {“123456”, “Иванов И.И.” };
Если список инициализации будет короче, то оставшиеся поля структурной переменной будут заполнены нулями.
Элементом структуры могут быть битовые поля (строки битов):
struct fields
{
unsigned int flag:1;
unsigned int mask:10;
unsigned int code:5;
};
после символа «:» указывается длина битового поля, не превышающая разрядность поля типа int.
Битовые поля размещаются последовательно в поле типа int, при нехватке места для очередного битового поля - переход на следующее поле типа int. Возможно объявление безымянных битовых полей, а длина поля 0 означает необходимость перехода на очередное поле int:
struct areas
{
unsigned f1:1;
:2; /* Безымянное поле длиной 2 бита */
unsigned f2:5;
:0 /* Признак перехода на следующее поле int */
unsigned f3:5;
float data; /* Структура может содержать */
char buffs[100]; /* элементы любых типов данных */
};
Битовые поля могут использоваться в выражениях как целые числа соответствующей длине поля разрядности в двоичной системе счисления. Единственное отличие этих полей от обычных объектов - запрет операции определения адреса (&). Следует учитывать, что использование битовых полей снижает быстродействие программы по сравнению с представлением данных в полных полях из-за необходимости выделения битового поля.
Структурный тип данных удобно применять для группового управления манипулирования логически связанными объектами. Параметрами таких операций являются адрес и размер структуры.
Примеры групповых операций:
- захват и освобождение памяти для объекта, представленного совокупностью не обязательно однотипных данных;
- запись и чтение данных, хранящихся на внешних носителях как физические и/или логические записи с известной структурой.