Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SAOD_Konspekt-I.doc
Скачиваний:
14
Добавлен:
03.11.2018
Размер:
2.32 Mб
Скачать

5. Интегральные типы данных (структуры, битовые поля, объединения)

5.1. Структуры

Структура является набором логически связанной информации, возможно, различных типов, объединённым в единый программный объект. Термин «структура» в Си/Си++ является синонимом понятия «запись», используемого в Паскале. Оба термина являются взаимозаменяемыми. Структура может означать как тип данных, так иобъект этого типа. Определение структурного типа в Си/Си++ напоминает определение записи в Паскале, но в Си/Си++ отсутсвуют некоторые ограничения Паскаля на размещение указателей.

struct Student

{

char FirstName[10];

char SecondName[15],Surname[20];

int Age;

char Dept[10];

int Year;

};

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

Student Petrov; // Объявление структуры типа Student

Student i31[21]; // массив структур

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

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

Доступ к компонентам структуры происходит при помощи операции «.»:

Petrov.Year = 3;

Имя структурного типа при его определении может отсутствовать, если в программе имеется одна или несколько структур только одного типа.

struct { /* поля структуры */ } st1, st2, st3;

Операция & позволяет получить адрес структуры, который может храниться в указателе.

Student *r32; // указатель на структуру

r32 – адрес структуры типа Student

*r32 – сама структура

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

(*r32).Age = 30;

Приоритет операции «.» выше, чем операции *, поэтому круглые скобки ( ) в данном случае необходимы. Возможна другая, чаще используемая, форма доступа к полям структуры через указатель при помощи операции –> :

r32–>Age = 30;

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

Student& PrintInfo(Student&);

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

struct Err

{ Err d; ... }; // Ошибка

struct Corr

{ Corr *pc; ... };

Полем определяемого структурного типа может быть структура, тип которой уже определён.

struct Beg{...} golf;

struct next{ Beg st; ...};

Если в определении структурного типа нужно в качестве элемента использовать указатель на структуру другого типа, то разрешена такая последовательность определений.

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

struct B {struct A *pa};

struct A {struct B *pb};

Неполное определение структурного типа A можно использовать в определении структурного типа B, так как определение указателя pa на структуру типа A не требует информации о размере структуры типа A. Последующее определение структурного типа A обязательно. Использование в структурах типа A указателей на структуры уже введенного типа B не обладает какими-либо дополнительными особенностями и не требует пояснений.

Структурный тип может быть определен с помощью спецификатора typedef.

typedef struct { double Re,Im; } complex;

complex Z1,Z2;

struct a1

{ ...

int oscar;

};

struct a2

{ ...

a1 lima; // поле ранее определенного структурного типа

}tango; // совместное определение структурного типа и его объекта

//...

tango.lima.oscar=256; // доступ к вложенному полю объекта tango

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