В този урок ще научите за обединенията в програмирането на 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 профсъюзи?