Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcija-18.pdf
Скачиваний:
17
Добавлен:
27.03.2016
Размер:
285.74 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]