Серьезным недостатком языков пр-ия является невозможность создания объектов данных, предст. собой совокупность разнообразных элементов. В языке Си эти ограничения преодолены. Пользователь может сформировать тип и объявить переменную произвольной конфигурации.
Наиболее мощный агрегированный тип языка Си, позволяющий объединять в одном объекте данных любое количество значений любых типов. Объявление структуры предполагает создание и регистрацию типа данных пользователя.
Struct [<тег>] {<список структуры>} <ид> [,<ид>,…];
Struct <тег> <ид> [,<ид>,…];
Тег – имя структуры. Список <спецификация типа> <ид> [, <ид>,…];
Перед спецификацией типа не д.б. спецификатора памяти. Внутри структуры нельзя объявлять структуру с этим же тегом, однако можно объявить указатель на структуру с этим же тегом. Внутри списка структуры все ид. д.б. уникальны, хотя они не конфликтуют с ид. из списков др. агрегированных типов, с тегом и структурной переменной. Тег же конфликтует только с другими тегами. Объявление по 2 синтаксической форме возможно лишь тогда, когда ранее было записано по 1 синтаксической форме с заданным именем тега (это ссылка).
В ОП элементы структуры располагаются в том порядке, в каком они записаны в списке. Для доступа к элементу структуры исп. имя и следующие операции: . – через непосредственно заданную переменную и ® - через указатель на переменную структурного типа.
Struct stud
{
char name [18];
char surname [18];
int age;
} vasja; *pa
vasja. name[0]=’a’;
pa®name[0]=’a’;
Элементы структуры размещаются в ОП с выравниванием на некоторую границу. Смысл выравнивания заключается в том, что поле, отводимое под переменную, начинается с байта, адрес которого кратен 1,2,4,8 поэтому длина переменной не кратна параметру выравнивания между элементами могут появиться незанятые и недоступные промежутки.
Минимально адресуемой единицей в памяти ЭВМ является байт. Практически никакие языки пр-ия не позволяют получить доступ к группе битов внутри байта. В Си это возможно. Данный механизм реализован только для структуры. Битовые поля позволяют плотно упаковать значения в группе битов для экономии ОП.
Структура, описывающая битовые поля, отличается синтаксисом списка: <unsigned int> <ид>: <конст. выражение> конст. выраж - (0-16). При обработки структуры, содержащей битовые поля, компилятор размещает в ОП беззнаковую целую переменную, резервирует число байт, указанное константным выражением под битовое поле с заданным инд. Есть 2 случафя объявления битовых полей: когда нет ид – поле распределяется, но к нему нет доступа, и константное выражение = 0 – принудит. Пропуск оставшихся свободных битов и след. Битовое поле распределяется в новом машинном слове.
Struct tg
{
unsigned: 5;
unsigned a: 10;
unsigned b: 8;
unsigned: 0;
unsigned c: 3;
} d[2]
Никакие операции, связанные с адресами к битовым полям не применимы (т.к. минимальной единицей является байт).
Операции над структурой как единым целым: & - взять адрес, size of – определение размера в байтах, = - присваивание структур с одинаковыми тегами.
Объединение (union)
Агрегированный тип, позволяющий хранить в одном объекте значения разных типов в различные моменты времени. Только 1 из значений является актуальным. Контроль за правильностью исп. возлагается на программиста. Отличие от структуры – в способе размещения элементов - выделяется участок памяти = длине наибольшего элемента в списке объединения.
Union <тег> ид [, ид]
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.