- •Данных. Составные структуры данных
- •3.2.1 Общие положения
- •3.2.1.1 Алфавит языка
- •3.2.1.2 Формат программы
- •3.2.1.3. Комментарии
- •// Пример однострочного комментария
- •3.2.2.2 Типы данных
- •3.2.1.4 Зарезервированные слова
- •3.2.2 Данные
- •3.2.2.1 Идентификаторы данных
- •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.6 Структуры
Структурой называется идентифицированный агрегат логически взаимосвязанных данных произвольных типов.
Структура объявляется в соответствии с правилами:
объявление шаблона5 структуры ::= struct, идентификатор,
«{», объявление переменных | объявление массивов «}», «;»;
объявление структур ::= struct, идентификатор шаблона структуры,
идентификатор, [ «[», размерность, «]» ], [ =, инициализаторы, { инициализаторы } ],
{идентификатор, [ «[», размерность, «]» ], [ =, инициализаторы, { инициализаторы } ] },
«;»;
Например:
struct Star { // объявление шаблона структуры «звезда»
char Name [20]; // имя звезды
int Class; // «класс» звезды
float Ang, Dist; // координаты: угол видимости и расстояние
};
// объявление звезды Unona по шаблону Star с инициализацией данных
struct Star Unona = {"Unona", 5, 15., 123.45};
// объявление созвездия Persey из десяти звезд типа Star
struct Star Persey [10];
Элементом шаблона структуры может быть иная структура, например:
struct Planet { // объявление шаблона структуры «планета»
char Name [20]; // имя звезды
float Ang, Dist; // координаты: угол видимости и расстояние
};
struct PlanetSystem { // объявление шаблона структуры «планетная система»
struct Star psSun; // звезда системы
struct Planet psPlanet [10]; // планеты системы
};
struct PlanetSystem SunPlanetSystem;
Языком C++ допускается объединение объявления шаблона структуры и структуры, например:
struct MyStructPattern { // объявление шаблона структуры
int X;
float Y;
} MyStruct; // объявление структуры
Допускается также и объявление анонимной структуры (без предварительного объявления её шаблона), например:
struct {
int X;
float Y;
} NemoStruct; // объявление анонимной структуры
Объявление шаблона структуры эквивалентно созданию уникального типа данных. Поэтому, даже если элементы шаблонов идентичны друг другу, считается, что шаблоны объявляют разные типы данных. Например:
struct Pattern1 {
char name[101;
} Xl;
struct Pattern2 {
char name[10];
} X2;
Поэтому выполнение операции Xl = X2 приведет к возникновению ошибки. В то же время при объявлении:
struct Pattern {
char name[101;
} Xl, X2;
операция Xl = X2 не приводит к возникновению ошибки, поскольку Xl и X2 являются данными одного типа Pattern.
К элементу структуры обращаются согласно образцу идентификатор структуры. идентификатор элемента, например: Unona.Class или Persei [2].Ang.
Элементами структуры могут быть битовые поля, занимающих в памяти меньшую длину, чем целое данное стандартного типа. При вычислениях такой элемент структуры трактуется как данное типа int. Структура битовых полей занимает в памяти 16 битов и объявляется согласно правилам:
длина битового поля ::= целое;
объявление битового поля ::=
(char | int), [ идентификатор ], «:» , длина битового поля, «;»;
объявление шаблона структуры ::= struct, идентификатор,
«{», объявление битового поля, { объявление битового поля }, «}», «;»;
Пример объявления структуры битовых полей:
struct Bit_field {
int j : 2; // переменная j занимает всего 2 бита
unsigned i : 5; // переменная i занимает 5 битов
int : 4; // эти 4 бита поля не используются (идентификатор не указан)
int k : 1; // переменная k занимает всего 1 бит
unsigned n : 4; // переменная n занимает 4 бита
};
struct Bit_field A;
В этой структуре поля битов размещены, как показано на рисунке 3.2.3.
Рисунок 3.2.3
Так, если A=123(10) 0000 0 0000 11110 11 (2), то: A.j=11(2)3(10), A.i=11110(2) 30(10), A.k=0 и A.n=0.
