- •Структура как пользовательский тип и совокупность данных
- •Определение шаблона структуры и структурной переменной
- •Расположение структурных переменных в памяти
- •Инициализация структурных переменных
- •Вложенные структуры
- •Операции над структурными переменными
- •Массив структур
- •Структура в качестве аргумента функции
- •Примеры работы со структурами
- •person_list
- •Объединение как пользовательский тип и совокупность данных
- •Определение объединения и переменной объединяющего типа
- •Использование перечисляемого типа для обращения к полям объединения
- •Битовые поля структур и объединений
- •Определение битовых полей
- •Формирование кода символа с помощью битовых полей объединения
- •Формирование байта и вывод на экран его двоичного представления
Лекция 18 |
|
Структуры. Объединения. Поля битов в структурах |
|
Структура как пользовательский тип и совокупность данных ........................................ |
1 |
Определение шаблона структуры и структурной переменной............................................. |
1 |
Расположение структурных переменных в памяти................................................................ |
5 |
Инициализация структурных переменных ............................................................................. |
7 |
Вложенные структуры .............................................................................................................. |
7 |
Операции над структурными переменными........................................................................... |
8 |
Массив структур...................................................................................................................... |
10 |
Структура в качестве аргумента функции............................................................................ |
11 |
Примеры работы со структурами .......................................................................................... |
12 |
Объединение как пользовательский тип и совокупность данных.................................. |
15 |
Определение объединения и переменной объединяющего типа........................................ |
15 |
Примеры использования объединений ................................................................................. |
17 |
Получение внутреннего представления вещественного числа................................... |
17 |
Использование перечисляемого типа для обращения к полям объединения............ |
17 |
Битовые поля структур и объединений............................................................................... |
19 |
Определение битовых полей.................................................................................................. |
19 |
Примеры использования битовых полей.............................................................................. |
20 |
Вывод значений битовых полей..................................................................................... |
20 |
Формирование кода символа с помощью битовых полей объединения.................... |
21 |
Формирование байта и вывод на экран его двоичного представления...................... |
22 |
Структура как пользовательский тип и совокупность данных |
|
Определение шаблона структуры и структурной переменной |
|
Структура (структурный тип, шаблон структуры) – это тип, определяемый пользователем с использованием ключевого слова struct. Если массив – это совокупность однородных элементов (элементов одного типа), то структура – это объединение в единое целое множества поименованных элементов (полей данных), в общем случае, разных типов, имеющее для простоты одно имя.
Определение структуры (структурного типа, шаблона структуры) задает внутреннюю организацию структурных переменных после их определения и никак не связано с резервированием памяти компилятором, не создает никаких переменных. Структурный тип только задает правила формирования структурной переменной,
используемые компилятором при последующем определении структурной переменной для выделения ей места в памяти и организации доступа к ее полям. Структурный тип имеет уникальное имя в пределах области определения. Имя структурного типа используется при определении структурных переменных аналогично встроенным типам.
struct date{ |
|
имя (тег) структуры |
|
int day;
int month;
int year; элементы структуры (поля, члены-данные)
char mon_name[10];
};
Программирование – лекция 18 (лекции Стрикелевой Л.В.)
1
ключевое слово |
определение структуры |
|
(структурного типа, шаблона структуры) |
Синтаксис определения структуры (структурного типа, шаблона структуры): 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 |
Book |
//структура «книга» |
struct |
||
|
{ |
|
|
char name [20]; |
|
|
chat title[44]; |
|
|
int year; |
|
}; |
float price; |
|
|
|
|
//4 |
Auto //структура «автомобиль» |
|
struct |
||
{ |
|
|
char fio[40]; |
//ФИО владельца |
|
char adres[60]; |
//адрес владельца |
|
int nomer; |
//номер авто |
char marka[20]; //марка авто
Программирование – лекция 18 (лекции Стрикелевой Л.В.)
2
};
//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 опускается |
|
!!! |
Для |
определения прямоугольных областей можно использовать |
предопределенную в заголовочном файле windows.h структуру RECT, соответствующую приведенной выше структуре Rectangle:
#include <windows.h>
RECT r1;
r1.left = 1; r1.top = 5; r1.right = 3; r1.top = 1; cout<< r1.left << endl;
Синтаксис С++ разрешает совмещать определение структурного типа и определение структурных переменных. Например:
struct Book {char name[20]; char title[44]; int year;
float price;
} first_book, child_book, dog_book [4], *ptr_book;
определение шаблона структуры
определение структурных переменных
Программирование – лекция 18 (лекции Стрикелевой Л.В.)
3
Определение структурного типа может быть анонимным. В этом случае сразу следует определять структурные переменные. Например:
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] |
Имена полей одного типа можно перечислить через запятую.
Программирование – лекция 18 (лекции Стрикелевой Л.В.)
4