Операционная система UNIX. Руководство программиста




Описания структур и объединений - часть 2


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

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

Спецификатор_структуры_или_объединения во второй форме, то есть

struct идентификатор { список_структ_описаний }

union идентификатор { список_структ_описаний }

описывает идентификатор, являющийся тегом структуры (тегом объединения), специфицируемой списком_структ_описаний. Последующие описания могут затем использовать третью форму спецификатора:

struct идентификатор union идентификатор

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

Третью форму спецификатора_структуры_или_объединения можно использовать перед описанием, дающим полную спецификацию структуры или объединения в случаях, когда не требуется знать размер структуры или объединения. Размер не важен в двух ситуациях: когда описывается указатель на структуру или объединение и когда при помощи конструкции typedef описывается имя, являющееся синонимом структуры или объединения. Тем самым появляется возможность описать, например, пару структур, содержащих указатели друг на друга.

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

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

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

Структура содержит массив из 20 символов, целое число и два указателя на аналогичные структуры. Затем с помощью конструкции

struct tnode s, *sp;

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

sp->count

обозначает поле count структуры, на которую указывает sp;

s.left

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

s.right->tword [0]

есть первый символ поля tword в правом поддереве s.




Содержание  Назад  Вперед