Создание структурных переменных

Декларация структурного типа данных

Структуры

Краткие теоретические сведения

Программирование алгоритмов с использованием структур

Структура - это составной объект языка Си, представляющий собой совокупность логически связанных данных различного типа, объединенных в группу под одним идентификатором. Данные, входящие в эту группу, называют полями.

Термин «структура» в языке С/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]; /* элементы любых типов данных */

};

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

Структурный тип данных удобно применять для группового управления манипулирования логически связанными объектами. Параметрами таких операций являются адрес и размер структуры.

Примеры групповых операций:

- захват и освобождение памяти для объекта, представленного совокупностью не обязательно одно­типных данных;

- запись и чтение данных, хранящихся на внешних носителях как физические и/или логические записи с известной структурой.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: