Наиболее мощный агрегированный тип языка Си. Возможность создания объективных данных

Страницы работы

Содержание работы

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

Структура

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

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 <тег> ид [, ид]

Похожие материалы

Информация о работе