Язык программирования C++ для профессионалов


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


struct fudge { union { int i; int* p; }; };

fudge a; a.i = 4095; int* p = a.p; // некорректное использование

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

Иногда объединения используют специально, чтобы избежать преобразования типов. Например, можно использовать fudge, чтобы узнать, как представляется указатель 0:

fudge.p = 0; int i = fudge.i; // i необязательно должно быть 0

Объединению можно дать имя, то есть можно сделать его полноправным типом. Например, fudge можно описать так:

union fudge { int i; int* p; };

и использовать (некорректно) точно так же, как и раньше. Вместе с тем, поименованные объединения можно использовать и вполне корректным и оправданным способом.

© 2003-2007 INTUIT.ru. Все права защищены.




Начало  Назад  



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