В този урок ще научите за обединенията в програмирането на C. По-конкретно, как да създавате синдикати, да осъществявате достъп до членовете им и да научавате разликите между синдикатите и структурите.
Обединението е дефиниран от потребителя тип, подобен на структурите в C, с изключение на една ключова разлика. Структурите отделят достатъчно място за съхраняване на всичките си членове, докато профсъюзите разпределят пространството за съхраняване само на най-големия член.
Как да дефинирам съюз?
Използваме unionключовата дума за дефиниране на обединения. Ето пример:
union car ( char name(50); int price; );
Горният код дефинира производен тип union car.
Създайте променливи на обединението
Когато обединението е дефинирано, то създава дефиниран от потребителя тип. Обаче не е разпределена памет. За да разпределим памет за даден тип съюз и да работим с него, трябва да създадем променливи.
Ето как създаваме обединени променливи.
union car ( char name(50); int price; ); int main() ( union car car1, car2, *car3; return 0; )
Друг начин за създаване на обединени променливи е:
union car ( char name(50); int price; ) car1, car2, *car3;
И в двата случая се създават обединени променливи car1, car2 и обединителен указател car3 от union carтипа.
Достъп до членове на съюз
Използваме .оператора за достъп до членове на съюз. За достъп до променливите на указателя използваме също ->оператора.
В горния пример,
- За цените за достъп
car1,car1.priceсе използва. - За достъп до цената се използва
car3или,(*car3).priceилиcar3->priceможе да се използва.
Разлика между съюзи и структури
Нека вземем пример, за да демонстрираме разликата между съюзи и структури:
#include union unionJob ( //defining a union char name(32); float salary; int workerNo; ) uJob; struct structJob ( char name(32); float salary; int workerNo; ) sJob; int main() ( printf("size of union = %d bytes", sizeof(uJob)); printf("size of structure = %d bytes", sizeof(sJob)); return 0; )
Изход
размер на обединението = 32 размер на структурата = 40
Защо тази разлика в размера на променливите на обединението и структурата?
Тук размерът на sJob е 40 байта, защото
- размерът на
name(32)е 32 байта - размерът на
salaryе 4 байта - размерът на
workerNoе 4 байта
Размерът на uJob обаче е 32 байта. Това е така, защото размерът на променливата на обединението винаги ще бъде размерът на най-големия й елемент. В горния пример размерът на най-големия му елемент ( name(32)) е 32 байта.
При обединение всички членове споделят една и съща памет .
Пример: Достъп до членове на Съюза
#include union Job ( float salary; int workerNo; ) j; int main() ( j.salary = 12.3; // when j.workerNo is assigned a value, // j.salary will no longer hold 12.3 j.workerNo = 100; printf("Salary = %.1f", j.salary); printf("Number of workers = %d", j.workerNo); return 0; )
Изход
Заплата = 0,0 Брой на работниците = 100
За да научите къде се използват съюзите, посетете Защо се нуждаем от C профсъюзи?








