Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Shpory_moi.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.15 Mб
Скачать

46 Массивы структур. Битовые поля

Массивы структур

Структурный тип может быть использован для декларации массивов, элементами которых являются структурные переменные, например:

struct person spisok[100]; - spisok - массив структур;

или struct person {

char fio[40];

int day, month, year;

} spisok[100];

В данном случае обращение к полю, например, day i-й записи может быть выполнено одним из следующих способов: spisok[i].day, *(spisok+i).day, (spisok+i)->day.

Битовые поля

Структура может содержать любые комбинации битовых полей с данными других типов. Целочисленные элементы типа signed или unsigned можно объявить битовыми полями шириной от 1 до 16 бит. Ширина битового поля и его необязательный идентификатор задаются следующим образом:

спецификатор_типа <идентификатор_битового_поля>:длина; где "спецификатор_типа" - это char, unsigned char, int или unsigned int. Битовые поля располагаются с нижнего и кончая старшим битом слова. Выражение "длина" должно быть задано и должно задавать целочисленную константу со значением в диапазоне от 0 до 16.

Если идентификатор битового поля опущен, то число бит, заданное выражением "длина", распределяется в памяти, но поле при этом остается недоступным программе. Это позволяет создавать битовые шаблоны для, например, аппаратных регистров компьютера, в которых некоторые биты не используются. Например:

struct mystruct {

int i:2;

unsigned j:5;

int :4;

int k:1;

unsigned m:4;

} a, b, c;

Целочисленные поля хранятся в виде дополнения до двух, причем крайний левый бит побещается в наиболее значащий бит. Для битового поля типа int (например, signed) наиболее значащий бит интерпретируется как знаковый бит. Битовое поле шириной 2, содержащее двоичное 11, будет, следовательно, в случае типа

unsigned интерпретироваться как 3, а в случае int как -1. В предыдущем примере допустимое выражение a.i = 6 поместит в a.i двоичное значение 10 = -2, не выдавая каких-либо предупреждений. Поле k типа signed int шириной 1 может содержать только значения -1 и 0, так как битовый шаблон 1 будет интерпретирован как -1.

Примечание: Битовые поля могут объявляться только в структурах, объединениях и классах. Доступ к ним

выполняется теми же селекторами элементов (операциями . и ->), что используются для доступа к

элементам других типов. Кроме того, битовые поля вызывают некоторые проблемы с созданием переносимых кодов, поскольку организация бит в байтах и байт в словах зависит от конкретной машины.

Выражение &mystruct.x недопустимо, так как x - это идентификатор битового поля, а никакой гарантии, что mystruct.x имеет адрес на границе байта, нет.

47 Объединения. Перечисления

Объединения

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

Объединенный тип данных декларируется подобно структурному: union ID_объединения {

описание полей

};

Пример описания объединенного типа:

union word {

int nom;

char str[20];

};

Пример объявления объектов объединенного типа:

union word *p_w, mas_w[100];

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

Перечисления

Перечисления - это средство создания типа данных посредством задания ограниченного множества значений. Определение перечислимого типа данных имеет вид

enum ID_перечислимого типа {

список значений };

Значения данных перечислимого типа указываются идентификато-рами, например:

enum marks {

zero, two, three, four, five

};

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

Примеры объявления переменных перечислимого типа:

enum marks Est;

enum level state;

Переменная типа marks может принимать только значения из множества

{zero, two, three, four, five}.

Основные операции с данными перечислимого типа:

- присваивание переменных и констант одного типа;

- сравнение для выявления равенства либо неравенства.

Практическое назначение перечисления - определение множества различающихся символических констант целого типа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]