Язык программирования Си


A Объявления структур и объединений - часть 3


Элементы структуры имеют возрастающие по мере объявления элементов адреса. Элементы структуры, не являющиеся полями, выравниваются по границам адресов в зависимости от своего типа; таким образом, в структуре могут быть безымянные дыры. Если указатель на структуру приводится к типу указателя на ее первый элемент, результат указывает на первый элемент.

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

Вот простой пример объявления структуры:

struct tnode { char tword[20]; int count; struct tnode *left; struct tnode *right; };

Эта структура содержит массив из 20 символов, число типа int и два указателя на подобную структуру. Если дано такое объявление, то

struct tnode s, *sp;

объявит s как структуру заданного вида, a sp - как указатель на такую структуру. Согласно приведенным определениям выражение

sp->count

обращается к элементу count в структуре, на которую указывает sp;

s.left

- указатель на левое поддерево в структуре s, а

s.right->tword[0]

- это первый символ из tword - элемента правого поддерева s.

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

union { struct { int type; } n;

struct { int type; int intnode; } ni;

struct { int type; float floatnode; } nf; } u;

...

u.nf.type = FLOAT; u.nf.floatnode = 3.14; ...

if (u.n.type == FLOAT) ... sin(u.nf.floatnode) ...




- Начало -  - Назад -  - Вперед -



Книжный магазин