
- •Лекция 18 Структуры. Объединения. Поля битов в структурах
- •Структура как пользовательский тип и совокупность данных Определение шаблона структуры и структурной переменной
- •Расположение структурных переменных в памяти
- •Инициализация структурных переменных
- •Вложенные структуры
- •Операции над структурными переменными
- •Массив структур
- •Структура в качестве аргумента функции
- •Примеры работы со структурами
- •Объединение как пользовательский тип и совокупность данных Определение объединения и переменной объединяющего типа
- •Примеры использования объединений Получение внутреннего представления вещественного числа
- •Использование перечислимого типа для обращения к полям объединения
- •Битовые поля структур и объединений Определение битовых полей
- •Примеры использования битовых полей Вывод значений битовых полей
- •Формирование кода символа с помощью битовых полей объединения
- •Формирование байта и вывод на экран его двоичного представления
Лекция 18 Структуры. Объединения. Поля битов в структурах
Структура как пользовательский тип и совокупность данных 1
Определение шаблона структуры и структурной переменной 1
Расположение структурных переменных в памяти 5
Инициализация структурных переменных 6
Вложенные структуры 7
Операции над структурными переменными 8
Массив структур 10
Структура в качестве аргумента функции 11
Примеры работы со структурами 12
Объединение как пользовательский тип и совокупность данных 15
Определение объединения и переменной объединяющего типа 15
Примеры использования объединений 17
Получение внутреннего представления вещественного числа 17
Использование перечислимого типа для обращения к полям объединения 17
Битовые поля структур и объединений 18
Определение битовых полей 18
Примеры использования битовых полей 20
Вывод значений битовых полей 20
Формирование кода символа с помощью битовых полей объединения 21
Формирование байта и вывод на экран его двоичного представления 21
Структура как пользовательский тип и совокупность данных Определение шаблона структуры и структурной переменной
Структура (структурный тип, шаблон структуры) – это тип, определяемый пользователем с использованием ключевого слова struct для объединения в единое целое, имеющее имя, множества поименованных элементов (полей данных), в общем случае, разных типов.
Определение структуры (структурного типа, шаблона структуры) задает внутреннюю организацию структурных переменных после их определения и никак не связано с резервированием памяти компилятором, не создает никаких переменных. Структурный тип только задает правила формирования структурной переменной, используемые компилятором при последующем определении структурной переменной для выделения ей места в памяти и организации доступа к ее полям. Структурный тип имеет уникальное имя в пределах области определения. Имя структурного типа используется при определении структурных переменных аналогично встроенным типам.
s
int month; int year; char mon_name[10];
|
и
элементы структуры (поля, члены-данные) |
ключевое слово |
определение структуры (структурного типа, шаблона структуры) |
Синтаксис определения структуры (структурного типа, шаблона структуры):
struct pattern_name { type1 field_name1; type2 field_name2; ….. typeN field_nameN;
};
или, в случае полей одного типа:
struct pattern_name { type1 field_name1, field_name2; ….. typeK field_nameN;
};
где:
pattern_name – имя шаблона, удовлетворяющее правилам задания идентификаторов языка;
type1, type2, … typeN – любые типы;
field_name1, field_name2, …, field_nameN – имена полей, удовлетворяющие правилам задания идентификаторов языка.
Элементом структуры в С++ может быть и функция.
Примеры определений структурного типа:
//1
struct PointRecType //структурный тип «точка»
{ int x, y;
};
//2
struct ColorPointRecType //структурный тип «цветная точка»
{ int x, y;
unsigned color;
};
//3
struct Book //структурный тип «книга»
{
char name [20];
chat title[44];
int year;
float price;
};
//4
struct Auto //структурный тип «автомобиль»
{
char fio[40]; //ФИО владельца
char adres[60]; //адрес владельца
int nomer; //номер авто
char marka[20]; //марка авто
};
//5
struct Student //структурный тип «студент»
{
unsigned short gruppa;
char fio[20];
unsigned short ocenki[KOL_OC]; //массив оценок на экзамене
};
//6
struct Rectangle //структурный тип «прямоугольник»
{
int left; //пара координат верхней левой точки
int top;
int right; //пара координат нижней правой точки
int bottom;
};
//7
struct Box //структурнвй тип «ящик»
{
double length; //длина
double width; //ширина
double heigth; //высота
};
Определение структурной переменной состоит из двух шагов:
определение структурного типа (шаблона структуры, структуры);
собственно определение структурной переменной
Определение структурных переменных s1 и s2 для приведенной выше структуры Student выглядит следующим образом:
Student s1, s2; //ключевое слово struct опускается
Синтаксис С++ разрешает совмещать определение структурного типа и определение структурных переменных. Например:
s
truct
Book {char
name[20]; определение
структурного типа
char title[44];
int year;
float price; определение структурных переменных
} first_book, child_book, dog_book [4], *ptr_book;
Определение структурного типа может быть анонимным. В этом случае сразу следует определять структурные переменные. Например:
struct { // анонимный структурный тип
int pole1;
double pole2;
char *pole3;
} a,
b, *pb=&b,
*pc, &refa=a,
&refb(b);
определение
структурных переменных
Как мы видим, значением указателя на структуру может быть адрес структуры того же типа, т.е. адрес байта, начиная с которого структура размещается в памяти. Структурный тип задает ее размеры и тем самым определяет, на какую величину (на сколько байтов) изменится значение указателя на структуру, если к нему прибавить (или вычесть) 1.
Структурный тип может быть операндом операции new:
ptr_book = new Book; //выделяется память для структуры типа Book и //возвращается указатель на выделенную память.
Для структур могут быть определены и ссылки. Выше в примере показаны разные способы инициализации ссылок refa и refb.
Доступ к полям структурной переменной возможен в виде:
имя_структуры . имя_элемента_структуры // . – есть операция доступа к элементу (члену) структуры
имя_ссылки_на_структуру . имя_элемента_структуры
(*имя_указателя_на_структуру). имя_элемента_структуры
В последнем случае скобки обязательны, так как операция разыменования (*) должна относится только к указателю, а не к элементу структуры.
Для доступа к полям структурной переменной через указатель: (*имя_указателя_на_структуру).имя_элемента_структуры
используется также операция ->:
имя_указателя_на_структуру -> имя_элемента_структуры
// -> – есть операция непрямого доступа к элементу (члену) структуры
В случае шаблона структуры:
struct date{
int day;
int mes;
int year;
char mon_name[10];
} x, y, *ptr_date= &x;
эквивалентны записи:
(*ptr_date).year и ptr_date->year
(*ptr_date).mon_name[0] и ptr_date->mon_name[0]
Имена полей одного типа можно перечислить через запятую.
Например:
struct PointRecType
{int x, y;
};
Имена полей в одном шаблоне структуры должны быть уникальными. Однако в разных шаблонах можно использовать совпадающие имена полей. Более того, имя шаблона может совпадать с именами полей и переменных. Поскольку имена полей «скрыты» внутри шаблона, они могут дублировать «внешние» переменные и поля в других описаниях структур.
Например:
struct PointRecType //определение шаблона структуры PointRecType
{ int x, y;
};
struct ColorPointRecType //определение шаблона структуры ColorPointRecType
{int x, y;
unsigned color;
};
struct // определение шаблона структуры без имени
{ PointRecType point;
ColorPointRecType color_point;
} big_struct; // определение структурной переменной big_struct
int x, y; //определение простых переменных
PointRecType point; //определение структурной переменной типа PointRecType
ColorPointRecType color_point ; //определение структурной переменной типа ColorPointRecType
Здесь x, point.x, color_point.x, big_struct.point.x, big_struct.color_point.x – разные значения.
Как мы видим из примера, элементом определяемого структурного типа может быть другая структура, тип которой уже определен.
Область видимости шаблона структуры:
локальный шаблон структуры описан внутри блока { } и видим только из пределов данного блока, в частности из пределов конкретной функции;
если описание шаблона структуры помещено вне блоков, такой шаблон видим во всех функциях ниже точки описания шаблона до границы файла. Нельзя описать шаблон с реквизитом extern.