Главная Случайная страница


Полезное:

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


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Объединения





 

 

Oбъединения - это переменная, которая в различные момен-

ты времени может содержать объекты разных типов и размеров,

причем компилятор берет на себя отслеживание размера и тре-

бований выравнивания. Объединения представляют возможность

работать с различными видами данных в одной области памяти,

не вводя в программу никакой машинно-зависимой информации.

В качестве примера, снова из символьной таблицы компиля-

тора, предположим, что константы могут быть типа INT, FLOAT

или быть указателями на символы. значение каждой конкретной

константы должно храниться в переменной соотвествующего ти-

па, но все же для управления таблицей самым удобным было бы,

если это значение занимало бы один и тот же объем памяти и

хранилось в том же самом месте независимо от его типа. это и

является назначением объединения - выделить отдельную пере-

менную, в которой можно законно хранить любую одну из пере-

менных нескольких типов. Как и в случае полей, синтаксис ос-

новывается на структурах.

 

UNION U_TAG \(

INT IVAL;

FLOAT FVAL;

CHAR *PVAL;

\) UVAL;

 

Переменная UVAL будет иметь достаточно большой размер,чтобы

хранить наибольший из трех типов, независимо от машины, на

которой осуществляется компиляция, - программа не будет за-

висить от характеристик аппаратных средств. Любой из этих

трех типов может быть присвоен UVAR и затем использован в

выражениях, пока такое использование совместимо: извлекаемый

тип должен совпадать с последним помещенным типом. Дело

программиста - следить за тем, какой тип хранится в объеди-

нении в данный момент; если что-либо хранится как один тип,

а извлекается как другой, то результаты будут зависеть от

используемой машины.

 

Синтаксически доступ к членам объединения осуществляется

следующим образом:

 

имя объединения.член

--------------------

или

указатель объединения ->член

----------------------------

 

то есть точно так же, как и в случае структур. если для отс-

леживания типа, хранимого в данный момент в UVAL, использу-

ется переменная UTYPE, то можно встретить такой участок

программы:

 

IF (UTYPE == INT)

PRINTF("%D\N", UVAL.IVAL);

ELSE IF (UTYPE == FLOAT)

PRINTF("%F\N", UVAL.FVAL);

ELSE IF (UTYPE == STRING)

PRINTF("%S\N", UVAL.PVAL);

ELSE

PRINTF("BAD TYPE %D IN UTYPE\N", UTYPE);

 

Объединения могут появляться внутри структур и массивов

и наоборот. Запись для обращения к члену объединения в

структуре (или наоборот) совершенно идентична той, которая

используется во вложенных структурах. например, в массиве

структур, определенным следующим образом

 

STRUCT \(

CHAR *NAME;

INT FLAGS;

INT UTYPE;

UNION \(

INT IVAL;

FLOAT FVAL;

CHAR *PVAL;

\) UVAL;

\) SYMTAB[NSYM];

 

на переменную IVAL можно сослаться как

 

SYMTAB[I].UVAL.IVAL

 

а на первый символ строки PVAL как

 

*SYMTAB[I].UVAL.PVAL

 

В сущности объединение является структурой, в которой все

члены имеют нулевое смещение. Сама структура достаточно ве-

лика, чтобы хранить "самый широкий" член, и выравнивание

пригодно для всех типов, входящих в объединение. Как и в

случае структур, единственными операциями, которые в настоя-

щее время можно проводить с объединениями, являются доступ к

 

члену и извлечение адреса; объединения не могут быть присво-

ены, переданы функциям или возвращены ими. указатели объеди-

нений можно использовать в точно такой же манере, как и ука-

затели структур.

Программа распределения памяти, приводимая в главе 8,

показывает, как можно использовать объединение, чтобы сде-

лать некоторую переменную выровненной по определенному виду

границы памяти.

 

 







Date: 2015-09-17; view: 346; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.007 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию