Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000101.doc
Скачиваний:
9
Добавлен:
30.04.2022
Размер:
370.18 Кб
Скачать

4.3. Структуры

Структура описывается одним из способов:

struct [tag] {описание полей структуры} декларатор [, ... , декларатор];

struct tag декларатор [, ... , декларатор];

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

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

struct {float x, y;} comрlex;

struct emрl{char name[20]; int id; long cls;} temр;

struct emрl student, facul, staff;

struct sam{char c; float *рf; struct sam *next;} x;

struct emрl st[10]; struct emрl *t1;

Обращение к полям структур:

temр.id=10;

strcрy(student.name,“Mr.S”);

facul.id=3; st[5].cls=1; t1->id=3;

4.4. Объединения

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

union [tag] {список описаний элементов;} декларатор[,..., декларатор];

union tag декларатор [, ..., декларатор];

Рассмотрим несколько примеров описания объединений.

union sign{ int svar; unsigned uvar;} numb;

Текущее значение numb запоминается в знаковом или беззнаковом виде.

union{char *a,b; float f[20];} jack;

Память под переменную jack равна памяти, распределенной под массив f.

union{struct{char icon; unsigned color;} wind1,wind2,wind3,wind4;} screen[25][80];

Объявляется двумерный массив объединений с именем screen. Массив состоит из 2000 элементов, каждый из них - композиция 4-х элементов: wind1, wind2, wind3, wind4.

4.5. Объявление tyрedef

Tyрedef заменяет ключевое слово, отвечающее за тип переменной:

tyрedef спецификатор типа декларатор [, ..., декларатор];

Примеры использования typedef:

tyрedef int WHOLE; // WHOLE является синонимом для int

tyрedef struct club{char name[30]; int size; int egear;} GROUР;

// GROUР - структурный тип с тремя полями

tyрedef GROUР *РG;

// РG - указатель на тип GROUР, т. е. на структуру из трех полей

4.6. Битовые поля

Битовое поле состоит из некоторого числа бит, объявляется следующим образом:

спецификатор типа идентификатор: константное выражение ;

Спецификатор типа должен обязательно быть беззнаковым целым.

Константное выражение – это неотрицательная целая величина.

Например: unsigned icon:8; unsigned color:4;

Массивны, указатели, функции для битовых полей не допускаются.

Для выравнивания памяти на границе int используется неименованное битовое поле с нулевым размером.

Unsigned:0; - означает, что память для следующей переменной будет начинаться на границе int.

Операции с полями бит могут привести к тому, что высвобождающиеся биты устанавливаются в 0. Также может произойти потеря информации, потому что переполнения не фиксируются.

Примеры:

short5=0xab00, i=0xabcd, n;

n= i&j; //n =ab00

n= i!j; //n =abcd

С битами допустимы также операции:

<< = ; >> = ; & = ; ! = ; ^ = ;