Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19
Download 1.98 Mb.
|
Lekcii AiSD 2015
Структуры
Структура является набором логически связанной инфор- мации, возможно, различных типов, объединённым в единый программный объект. Термин «структура» в Си/Си++ является синонимом понятия «зплпсь», используемого в Паскале. Оба термина являются взаимозаменяемыми. Структура может озна- чать как тип данных, так и объект этого типа. Определение структурного типа в Си/Си++ напоминает определение записи в Паскале, но в Си/Си++ отсутствуют некоторые ограничения Пас- каля на размещение указателей. struct Student char FirstName[10]; char SecondName[15], Surname[20]; int Age; char Dept[10]; int Year; Отдельные компоненты структур часто называют полями. Объекты структурных типов, также часто называемые структу- рами, определяются следующим образом: S 4 uden L P e L rov; // Объявление структуры типа Student S 4 uden L i 31 [ 21 ) ; // массив структур Объекты структурного типа могут быть инициализированы, если имеют статический класс памяти, набором значений соот- ветствующих типов, заключённых в фигурные скобки и располо- женных в порядке объявления полей структуры, подобно тому, как инициализируются массивы. Поля, оставшиеся неинициали- зированными, получают нулевые значения или эквивалентные нулю. Статические массивы структур также могут быть инициали- зированы. Инициализирующие значения для каждого элемента 59
Доступ к компонентам структуры происходит при помощи операции «точка»: Petrov.Year = 3; Имя структурного типа при его определении может отсутст- вовать, если в программе имеется одна или несколько структур только одного типа. struct { /* поля структуры */ } st1, st2, st3; Операция & позволяет получить адрес структуры, который может храниться в указателе. Student *r32; // указатель на структуру r32 — адрес структуры типа Student *r32 сама структура Если имеется указатель на структурный тип, содержащий адрес реально существующей структуры, то доступ к полям с по- мощью указателя выполняется следующим образом: (*r32).Age = 30; Приоритет операции «точка» выше, чем операции *, поэто- му круглые скобки в данном случае необходимы. Возможна дру- гая, чаще используемая, форма доступа к полям структуры через указатель при помощи операции —v r32—>Age = 30; Могут существовать ссылкп на структурные типы. Обычно такие ссылки используются как возвращаемые значения и аргументы функций для предотвращения копирования структур в стек при их передаче в функции: Student& PrintInfo(Student&); 60 Поля структуры могут быть любого типа, стандартного или созданного программистом и известного к моменту его использо- вания. Существует только одно исключение. Поле структуры не может иметь такой же тип, как и структура, компонентом кото- рого это поле является. Но поле может быть указателем на струк- туру определяемого типа. struct Err { Err d; ... struct Corr // Ошибка { Corr *pc; }; // Правильно Полем определяемого структурного типа может быть структура, тип которой уже определён. struct Beg{...} golf; struct next{ Beg st; ...}; Если в определении структурного типа нужно в качестве элемента использовать указатель на структуру другого типа, то разрешена такая последовательность определений. struct А; // Неполное определение struct В {struct А *ра}; struct А {struct В *pb}; Неполное определение структурного типа А можно исполь- зовать в определении структурного типа В, так как определение указателя ра на структуру типа А не требует информации о раз- мере структуры типа А. Последующее определеНl4е структурного типа А оdязательно. Использование в структурах типа А указа- телей на структуры уже введенного типа В не обладает какими- либо дополнительными особенностями и не требует пояснений. Структурный тип может быть определен с помощью специ— фикатора typedef. typedef struct { double Re, lm; } complex; complex Z1,Z2; struct a1 int oscar; 61
struct a2 а 1 1ima ; // поле ранее определенного структурного типа ) 4anqo i // совместное определение структурного типа и его объекта La nqo . 1ima . о scar= 2 5 6 i // доступ к вложенному полю объ- екта La nqo Download 1.98 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling