Разновидности указателей в С ++. Замечания о работе менеджера кучи в С++. Ссылки, структуры и объединения, страница 4

struсt PRIM { char * name ; long num;} A,B,C;

При однократном использовании имя структуры можно не указывать.

Можно определить тип указателя на структуру

имя_структуры * имя_указателя;

card* prt=&rec1;     /           / совмещ-ся определение указателя и его инициализации

            С использованием указателя доступ к элементу структуры производится через операцию косвенного вызова:

имя_указателя®имя_атрибута;

или через операцию разыменования:

(*имя_указателя).имя_атрибута;

prt®pages;    (*prt).pages;

            В определение структурного типа может входить указатель на структуру:

struct record

{card book; record* prev; record* next;}

            Структуры размещаются в памяти с начала слова, то есть в байте с четным индексом. Если структура занимает нечетное количество байтов, она выравнивается на границу слова.

Атрибут структуры не может иметь тот же самый тип, что и определяемый структурный тип, но может быть указателем на структуру определяемого типа. Если требуется в состав структуры включить атрибут, имеющий тип другой структуры, то возможно его предварительное неполное определение.

struct A ;     // неполное определение

struct B { struct A* pa; …};

struct A { … };

            Структуры могут быть результатом возвращаемой функции. Функция также может возвращать указатель или ссылку на структуру.

card  func1 (…);     //прототип функции

card* func2 (…);     //возвращаемый указатель

card& func3 (…);     //возврат ссылки

            В качестве параметра структура может быть передана в функцию непосредственно, либо с помощью указателя или ссылки.

void func4 (card);   // прототип

void func5 (card*);

void func6 (card&);

            Память для размещения структуры может быть выделена динамически

card* prt=new card;

card* prt=new card[5];

prt[2].pages=600;

Объединения

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

            Определение типа объединения

union имя_объединяющего_типа {атрибуты объединения};

struct { long L; int i1, i2; char c [4]; } s

Размещение структуры в памяти

Объединение

union { long L; int i1, i2; char i[4]; } UNI;

Размеры атрибутов объединения определяются их типами, а размер объединения определяется максимальным размером его элементов. Объединение можно рассматривать как структуру, все атрибуты которой имеют нулевое смещение от ее начала и размещаются в одной и той же области памяти.

Можно определять массивы объединений, указатели и ссылки на объединения. Обращение к атрибутам объединения выполняется так же, как и к атрибутам структуры.

Основное назначение объединений:  выполнять различную интерпретацию одной и той же области памяти.

c. i = …;

cout << c.h [0] << c.h [1];

Элементами объединения могут быть массивы и структуры.

В модуле dos.h определены типы для обращения к регистрам процессора:

struct WORDREGS{ unsigned int ax,bx,cx,dx,si,di,cflag,flags; }

struct BYTEREGS { unsigned char al, ah, bl, bh, cl, ch, dl, dh; };

union REGS {struct WORDREGS x; struct BYTEREGS h;}

Объединения типа REGS используются при обращении к библиотечным функциям обработки прерываний.

union REGS in, out;      

char ch, attr;

in.h.ah = 8;                   // номер вызываемой функции через регистр ah

in.h.bh = page;          // номер страницы видеопамяти

int 86 (0x10, &in, &out);      // вызов 16 прерывания

ch=out.h.al;                   // значение кода АSCII символа из видеопамяти

attr = out.h.ah;               // атрибут символа из видеопамяти