
- •Данных. Составные структуры данных
- •3.2.1 Общие положения
- •3.2.1.1 Алфавит языка
- •3.2.1.2 Формат программы
- •3.2.1.3. Комментарии
- •// Пример однострочного комментария
- •3.2.1.4 Зарезервированные слова
- •3.2.2 Данные
- •3.2.2.1 Идентификаторы данных
- •3.2.2.2 Типы данных
- •3.2.2.3 Постоянные
- •3.2.2.4 Переменные
- •3.2.2.5 Массивы
- •3.2.2.6 Структуры
- •3.2.2.7 Объединения
- •Масив X:
- •Адреса элементу:
- •Масив y:
- •3.2.2.8 Перечисления
- •3.2.2.9 Указатели
- •Int Hour;
- •Int Press;
- •3.2.2.9.1 Динамическое выделения памяти для хранения данных
- •3.2.2.9.2 Динамическое освобождение памяти от хранимых данных
- •3.2.2.9.3 Ссылка
- •3.2.2.10 Множества
- •3.2.3 Выражения
- •3.2.3.1 Арифметические операции
- •Char int float | signed unsigned | short (базовый) long
- •3.2.3.2 Битовые операции
- •3.2.3.2 Логические операции
- •3.2.3.4 Операции отношения
- •3.2.3.5 Операция присваивания
- •3.2.3.6 Специальные операции
- •3.2.3.7 Элементарные функции
- •3.8 Приведение типов данных
- •3.2.3.9 Приоритеты операций
- •3.2.3.10 Адресные выражения
3.2.2.7 Объединения
Объединением называется идентифицированный агрегат данных произвольных типов и длины, элементы которого занимают одну и ту же область оперативной памяти.
Объединение объявляется в соответствии с правилами:
объявление шаблона объединения ::= union, [ идентификатор ],
«{», объявление переменных | объявление массивов «}», «;»;
объявление объединений ::= идентификатор шаблона объединения,
идентификатор, [ «[», размерность, «]» ],
{ идентификатор, [ «[», размерность, «]» ] }, «;»;
Например:
union Key { // объявление шаблона объединения переменной Press и массива Codes
int Press; // переменная Press длиной 2 байта
char Codes [2]; // массив Codes длиной 2 байта
};
Key Touch; // объявление объединения Touch типа Key
Пусть, например, требуется определить, какая именно клавиша клавиатуры была нажата пользователем. Нажатие некоторой клавиши клавиатуры приводит к тому, что в буфер клавиатуры заносятся: ASCII-код нажатого символа (в младший байт) и расширенный Scan-код нажатой клавиши (в старший байт). Тогда инструкция Touch.Press = bioskey (0) при нажатии клавиши <Enter> занесет в Touch.Press значение 7181 (рисунок 3.2.4).
Рисунок 3.2.4
Поэтому: Touch.Codes[0] = 13 (ASCII-код 1101(2) 13(10)), а Touch.Codes[1] = 28 (Scan-код 11100(2) 28(10)).
Длина объединения определяется длиной элемента с максимальным размером. Элементом шаблона объединения может быть иное объединение или структура. К тому же и объединение может быть элементом какой-либо структуры.
С помощью объединения можно, например, трактовать многомерный массив как одномерный:
union Datеs { // объявление шаблона объединения двухмерного массива Y
// и одномерного массива X
int Y [2][5]; // двухмерный массив Y длиной 20 байтов
int X [10]; // одномерный массив X длиной 20 байтов
}; Datеs Symbols;
После такого объявления массивы будут располагаться в памяти, как показано на рисунок 3.2.5.
Масив X:
Адреса элементу:
Масив y:
Рисунок 3.2.5
И если, например, в X2 занести значение 25, то Y0,2 тоже станет равным 25. Пользуясь этим, можно, например, отсортировать элементы двухмерного массива Y, сортируя элементы одномерного массива X (что сделать значительно проще); это приведет к тому, что элементы массива Y тоже будут представлены в отсортированном виде.
К элементу объединения обращаются согласно образцу: идентификатор объединения.идентификатор элемента.
Если объединение объявлено как анонимное (безымянное), то обращаться к его элементу можно просто по имени элемента.
3.2.2.8 Перечисления
Перечислением называется идентифицированный агрегат данных, описывающий совокупность идентифицированных инициализированных постоянных целого типа.
Перечисление объявляется в соответствии с правилами:
объявление шаблона перечисления ::= enum, [ идентификатор ],
«{», идентификатор, =, целое, {«,», идентификатор, =, целое }, «}», «;»;
объявление перечислений ::= идентификатор шаблона перечисления,
идентификатор, [ «[», размерность, «]» ],
{ идентификатор, [ «[», размерность, «]» ] }, «;»;
Первый элемент перечисления по умолчанию инициализируется нулем, каждый последующий – значением, на единицу большим, чем предыдущий. Однако любой элемент перечисления можно явно инициализировать целой константой и это, естественно, оказывает влияние на все последующие элементы перечисления. Например:
enum Colors { // объявление шаблона перечисления Colors
Red(=0), Green = 4, Yellow(=5), Cyan = 8, Brown(=9);
};
Colors Palette1, Palette2; // объявление перечислений Palette1, Palette2 типа Colors
К элементу перечисления обращаются согласно образцу: идентификатор перечисления.идентификатор элемента, например: Palette1.Red (т.е. 0).
Элементы массивов, структур и объединений также могут быть объявлены как данные со значениями только из перечисления, например:
Colors XPal [20]; // каждый элемент массива XPal может принимать только
// значения из перечисления Colors
XPal [8] = Red; // XPal [8] = 0
XPal [3] = Yellow; // XPal [3] = 5
XPal [1] = 1; // неверно, поскольку 1 не является элементом перечисления Colors