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



         

Объединения - часть 2


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, показывает, как можно использовать объединение, чтобы сделать некоторую переменную выровненной по определенному виду границы памяти.




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