Лекция 16
Структуры. Объединения. Поля битов в структурах
В ходе лекции необходимо усвоить:
· Понятие структуры, шаблона структуры
· Описание структурной переменной
· Вложенные структуры
· Указатель на структурную переменную
· Массивы структурных переменных
· Передача структуры в функцию
· Объединения
· Поля битов структуры
Структуры и объединения – это один из примеров составных типов данных, называемых агрегатными типами или просто агрегатами.
Структурные переменные (часто называемые просто «структуры»), - это объединение одной или более переменных, возможно, разных типов, в одну область памяти, имеющую для простоты одно имя. Отдельные составные части структурной переменной будем далее называть полями. Но термин «структура» в С++ имеет и другой смысл. Правила формирования структурной переменной, используемые компилятором для выделения ей места в памяти и организации доступа к ее полям, называются шаблоном структуры (шаблоном структурной переменной, структурой).
Задание шаблона (определение структуры) никоим образом не связано с резервированием какой-либо памяти компилятором и не создает никаких переменных. Определение шаблона структуры (или просто, определение структуры) фактически задает внутреннюю организацию структурных переменных, после того, как они будут определены. Шаблон дает компилятору всю необходимую информацию о полях структурной переменной для резервирования места в памяти и организации доступа к этой памяти при определении структурной переменной и ссылках на её отдельные поля. Каждый шаблон имеет собственное уникальное имя в пределах области определения для того, чтобы компилятор мог различать различные шаблоны. Имя шаблона в С++ является типом данных и используется в объявлениях переменных аналогично встроенным типам.
Как и любая переменная, структурная переменная должна быть определена. Определение структурной переменной состоит из двух шагов:
· определение шаблона структуры (определение структуры);
· собственно определение структурной переменной
struct date{ int day; int month; int year; char mon_name[10]; }; |
имя (тег) структуры – тип данных элементы структуры (поля, члены-данные) |
ключевое слово |
шаблон структуры |
Синтаксис шаблона структуры имеет вид:
struct pattern_name {type1 field_name1; type2 field_name2; ….. typeN field_nameN;};
где:
Синтаксис С++ разрешает совмещать определение шаблона и определение структурной переменной. Например:
struct BOOK {char name[20];
char title[44];
int year;
float price;
} first_book, child_book, dog_book [4], *ptr_book;
Определение struct может быть анонимным. Но в этом случае сразу же следует определять структурные переменные этого типа.
Например:
struct { // анонимный структурный тип
int pole1;
double pole2;
char *pole3;
} a, b, c; // а, b, с – переменные этого типа.
Доступ к отдельным полям структурной переменной возможен в виде:
имя_структуры . имя_элемента_структуры
имя_ссылки_на_структуру . имя_элемента_структуры
(*имя_указателя_на_структуру). имя_элемента_структуры
Для доступа к полям структурной переменной через указатель используется также операция à:
(имя_указателя_на_структуру) ->имя_элемента_структуры
Например:
struct date{
int day;
int mes;
int year;
char mon_name[10];
} x, y, *ptr_date= &x;
Тогда ссылка на поле структурной переменной через указатель имеет вид: (*ptr_date).year или эквивалентная ей ссылка ptr_data->year с использованиемоперации -> (доступ к полю year структурной переменной по указателю), а ptr_data->mon_name[0] – 1-ый символ поля mon_name.
.
Имена полей в одном шаблоне структуры должны быть уникальными. Однако в разных шаблонах можно использовать совпадающие имена полей. Более того, имя шаблона может совпадать с именами полей и переменных. Поскольку имена полей «скрыты» внутри шаблона, они могут дублировать «внешние» переменные и поля в других описаниях структур. Например:
struct ColorPointRecType
{int x, y;
ColorPointRecType color_point;
} big_struct; //имя структурной переменной
int x, y;
PointRecType point;
ColorPointRecType color_point ;
Здесь x, point.x, color_point.x, big_struct.point.x, big_struct.color_point.x – разные значения.
Область видимости шаблона структуры:
· локальный шаблон описан внутри блока { } и видим только из пределов данного блока, в частности из пределов конкретной функции;
· если описание шаблона помещено вне блоков, такой шаблон видим во всех функциях ниже точки описания шаблона до границы файла. Нельзя описать шаблон с реквизитом extern.
Порядок описания полей в определении структуры задаёт их порядок расположения в памяти.
Рассмотрим структуру
struct {
long L;
int c1, c2;
char c[4];
} STR;
В памяти каждый элемент имеет свое место, и размещаются они последовательно:
f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff
long L int i1 int i2 char c[4]
Компилятор выделяет под структурную переменную число байтов памяти, достаточное для хранения всех ее полей. Однако выделенное число байтов не всегда равно сумме длин отдельных
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.