logo

Union i C

Union kan defineres som en brugerdefineret datatype, som er en samling af forskellige variabler af forskellige datatyper på den samme hukommelsesplacering. Fagforeningen kan også defineres som mange medlemmer, men kun ét medlem kan indeholde en værdi på et bestemt tidspunkt.

Union er en brugerdefineret datatype, men i modsætning til strukturer deler de den samme hukommelsesplacering.

Lad os forstå dette gennem et eksempel.

 struct abc { int a; char b; } 

Ovenstående kode er den brugerdefinerede struktur, der består af to medlemmer, dvs. 'a' af typen int og 'b' af typen Karakter . Når vi tjekker adresserne på 'a' og 'b', fandt vi ud af, at deres adresser er forskellige. Derfor konkluderer vi, at medlemmerne i strukturen ikke deler den samme hukommelsesplacering.

Når vi definerer foreningen, så fandt vi ud af at union er defineret på samme måde som strukturen er defineret, men forskellen er at union nøgleordet bruges til at definere union datatypen, mens struct nøgleordet bruges til at definere strukturen. Unionen indeholder datamedlemmerne, dvs. 'a' og 'b', når vi tjekker adresserne på begge variabler, fandt vi ud af, at begge har de samme adresser. Det betyder, at fagforeningens medlemmer deler den samme hukommelsesplads.

Lad os se på den billedlige repræsentation af hukommelsestildelingen.

Nedenstående figur viser den billedlige repræsentation af strukturen. Strukturen har to medlemmer; dvs. den ene er af heltalstypen, og den anden er af karaktertypen. Da 1 blok er lig med 1 byte; derfor vil 'a'-variabel blive tildelt 4 hukommelsesblokke, mens 'b'-variablen vil blive tildelt 1 hukommelsesblok.

Nedenstående figur viser den billedlige repræsentation af fagforeningsmedlemmer. Begge variabler deler den samme hukommelsesplacering og har den samme indledende adresse.

I fagforening vil medlemmer dele hukommelsespladsen. Hvis vi forsøger at foretage ændringer i nogen af ​​medlemmerne, vil det også blive afspejlet til det andet medlem. Lad os forstå dette koncept gennem et eksempel.

 union abc { int a; char b; }var; int main() { var.a = 66; printf('
 a = %d', var.a); printf('
 b = %d', var.b); } 

I ovenstående kodeks har fagforeningen to medlemmer, dvs. 'a' og 'b'. 'var' er en variabel af union abc-typen. I den hoved() metode, tildeler vi 66 til 'a'-variablen, så var.a vil udskrive 66 på skærmen. Da både 'a' og 'b' deler hukommelsesplaceringen, var.b vil udskrive ' B ' (ascii-kode 66).

Beslutning af foreningens størrelse

Forbundets størrelse er baseret på størrelsen af ​​det største medlem af forbundet.

Lad os forstå gennem et eksempel.

 union abc{ int a; char b; float c; double d; }; int main() { printf('Size of union abc is %d', sizeof(union abc)); return 0; } 

Som vi ved, er størrelsen af ​​int 4 bytes, størrelsen af ​​char er 1 byte, størrelsen af ​​float er 4 bytes, og størrelsen af ​​double er 8 bytes. Da den dobbelte variabel optager den største hukommelse blandt alle de fire variable, vil der i alt blive tildelt 8 bytes i hukommelsen. Derfor vil outputtet af ovenstående program være 8 bytes.

Adgang til medlemmer af fagforeningen ved hjælp af pointers

Vi kan få adgang til fagforeningens medlemmer gennem pointere ved at bruge (->) piloperatoren.

Lad os forstå gennem et eksempel.

 #include union abc { int a; char b; }; int main() { union abc *ptr; // pointer variable declaration union abc var; var.a= 90; ptr = &var; printf('The value of a is : %d', ptr->a); return 0; } 

I ovenstående kode har vi oprettet en pointer-variabel, dvs. *ptr, der gemmer adressen på var-variabelen. Nu kan ptr få adgang til variablen 'a' ved at bruge (->) operatoren. Derfor ville outputtet af ovenstående kode være 90.

Hvorfor har vi brug for C fagforeninger?

Overvej et eksempel for at forstå behovet for C-fagforeninger. Lad os overveje en butik, der har to varer:

  • Bøger
  • Skjorter

Butiksejere ønsker at gemme registreringerne af de ovennævnte to varer sammen med de relevante oplysninger. For eksempel inkluderer bøger titel, forfatter, antal sider, pris, og skjorter inkluderer farve, design, størrelse og pris. Egenskaben 'pris' er fælles i begge varer. Butiksejeren ønsker at gemme ejendommene, og derefter hvordan han/hun vil opbevare optegnelserne.

numpy meshgrid

I første omgang besluttede de at gemme posterne i en struktur som vist nedenfor:

 struct store { double price; char *title; char *author; int number_pages; int color; int size; char *design; }; 

Ovenstående struktur består af alle de varer, som butiksejeren ønsker at opbevare. Ovenstående struktur er fuldstændig brugbar, men prisen er fælleseje i både varerne og resten af ​​varerne er individuelle. Egenskaberne som pris, *titel, *forfatter og antal_sider tilhører Bøger, mens farve, størrelse, *design tilhører Skjorte.

Lad os se, hvordan vi kan få adgang til medlemmerne af strukturen .

 int main() { struct store book; book.title = 'C programming'; book.author = 'Paulo Cohelo'; book.number_pages = 190; book.price = 205; printf('Size is : %ld bytes', sizeof(book)); return 0; } 

I ovenstående kode har vi lavet en variabel af typen butik . Vi har tildelt værdierne til variablerne, titel, forfatter, antal_sider, pris, men bogvariablen har ikke egenskaber som størrelse, farve og design. Derfor er det spild af hukommelse. Størrelsen af ​​ovenstående struktur ville være 44 bytes.

Vi kan spare masser af plads, hvis vi bruger fagforeninger.

 #include struct store { double price; union { struct{ char *title; char *author; int number_pages; } book; struct { int color; int size; char *design; } shirt; }item; }; int main() { struct store s; s.item.book.title = 'C programming'; s.item.book.author = 'John'; s.item.book.number_pages = 189; printf('Size is %ld', sizeof(s)); return 0; } 

I ovenstående kode har vi lavet en variabel af typen butik. Da vi brugte fagforeningerne i ovenstående kode, så ville den største hukommelse optaget af variablen blive taget i betragtning til hukommelsesallokeringen. Outputtet af ovenstående program er 32 bytes. I tilfælde af strukturer opnåede vi 44 bytes, mens i tilfælde af fagforeninger er den opnåede størrelse 44 bytes. Derfor er 44 bytes større end 32 bytes, hvilket sparer masser af hukommelsesplads.