Структуры. Объединения. Поля битов в структурах. Структурные переменные. Понятие структуры, шаблона структуры

Страницы работы

Фрагмент текста работы

Лекция 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;};

где:

  • pattern_name – имя шаблона, удовлетворяющее правилам задания идентификаторов языка;
  • type1,  type2, …  typeN – любые типы;
  • field_name1, field_name2, …,  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 PointRecType

                                {int x, y;};

Доступ к отдельным полям структурной переменной возможен в виде:

имя_структуры . имя_элемента_структуры

имя_ссылки_на_структуру . имя_элемента_структуры

(*имя_указателя_на_структуру). имя_элемента_структуры

Для доступа к полям структурной переменной через указатель используется также операция à:

(имя_указателя_на_структуру) ->имя_элемента_структуры

Например:

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.

.

Имена полей в одном шаблоне структуры должны быть уникальными. Однако в разных шаблонах можно использовать совпадающие имена полей. Более того, имя шаблона может совпадать с именами полей и переменных. Поскольку имена полей «скрыты» внутри шаблона, они могут дублировать «внешние» переменные и поля в других описаниях структур. Например:

structPointRecType

                                {int x, y;};

struct  ColorPointRecType

{int x, y;

unsigned color;};

struct                                                   //структура без имени

{ PointRecType     point;

  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]

Компилятор выделяет под структурную переменную число байтов памяти, достаточное для хранения всех ее полей. Однако выделенное число байтов не всегда равно сумме длин отдельных

Похожие материалы

Информация о работе

Тип:
Конспекты лекций
Размер файла:
263 Kb
Скачали:
0