- •Структуры и алгоритмы обработки данных Введение
- •1. Структуры данных
- •1.1 Уровни структур данных
- •1.2 Классификация структур данных
- •1.3. Информация и ее представление в памяти эвм
- •2. Простые структуры данных
- •2.1. Понятие о типах данных
- •2.2. Перечисляемый тип данных
- •2.3. Стандартные типы данных
- •2.3.1. Целочисленные типы
- •2.3.2. Вещественные числа
- •2.3.3. Представление и структуры хранения логической информации
- •2.4. Указатели
- •2.4.1. Назначение и смысл указателей
- •2.4.2 Операции с адресами
- •2.4.3 Указатели на указатели
- •2.5. Алгоритмы обработки простых структур данных
- •3. Линейные статические структуры данных
- •3.1 Массивы
- •3.2. Динамические массивы
- •3.3. Многомерные массивы
- •3.4. Связь массивов с указателями
- •3.5. Строки
- •3.6. Массивы указателей
- •3.7. Интерпретация составных описателей
- •3.8 Алгоритмы обработки статических линейных струткур
- •4. Ссылки
- •5. Интегральные типы данных (структуры, битовые поля, объединения)
- •5.1. Структуры
- •5.2. Битовые поля
- •5.3. Объединения
- •6. Файлы
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