Элементы структуры имеют возрастающие по
Элементы структуры имеют возрастающие по мере объявления элементов адреса. Элементы структуры, не являющиеся полями, выравниваются по границам адресов в зависимости от своего типа; таким образом, в структуре могут быть безымянные дыры. Если указатель на структуру приводится к типу указателя на ее первый элемент, результат указывает на первый элемент.
Объединение можно представить себе как структуру, все элементы которой начинаются со смещением 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) ...
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий