logo

Union i C

Union kan definieras som en användardefinierad datatyp som är en samling av olika variabler av olika datatyper på samma minnesplats. Förbundet kan också definieras som många medlemmar, men endast en medlem kan innehålla ett värde vid en viss tidpunkt.

Union är en användardefinierad datatyp, men till skillnad från strukturer delar de samma minnesplats.

Låt oss förstå detta genom ett exempel.

 struct abc { int a; char b; } 

Ovanstående kod är den användardefinierade strukturen som består av två medlemmar, d.v.s. 'a' av typen int och 'b' av typen karaktär . När vi kontrollerade adresserna för 'a' och 'b' upptäckte vi att deras adresser är olika. Därför drar vi slutsatsen att medlemmarna i strukturen inte delar samma minnesplats.

När vi definierar union, då fann vi att union definieras på samma sätt som strukturen är definierad, men skillnaden är att nyckelordet union används för att definiera unionsdatatypen, medan nyckelordet struct används för att definiera strukturen. Fackföreningen innehåller datamedlemmarna, det vill säga 'a' och 'b', när vi kontrollerar adresserna för båda variablerna så fann vi att båda har samma adresser. Det innebär att fackets medlemmar delar samma minnesplats.

Låt oss ta en titt på den bildliga representationen av minnesallokeringen.

för loop i c

Nedanstående figur visar den bildliga representationen av strukturen. Strukturen har två medlemmar; dvs en är av heltalstyp och den andra är av teckentyp. Eftersom 1 block är lika med 1 byte; därför kommer variabeln 'a' att tilldelas 4 minnesblock medan variabeln 'b' kommer att tilldelas 1 minnesblock.

Bilden nedan visar den bildliga representationen av fackliga medlemmar. Båda variablerna delar samma minnesplats och har samma initiala adress.

I fackförening kommer medlemmarna att dela minnesplatsen. Om vi ​​försöker göra ändringar i någon av medlemmarna kommer det att återspeglas till den andra medlemmen också. Låt oss förstå detta koncept genom ett exempel.

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

I ovanstående kod har förbundet två medlemmar, dvs 'a' och 'b'. 'var' är en variabel av typen union abc. I den main() metoden tilldelar vi variabeln 66 till 'a', så var.a kommer att skriva ut 66 på skärmen. Eftersom både 'a' och 'b' delar minnesplatsen, var.b kommer att skriva ut ' B ' (ascii-kod 66).

Besluta storleken på förbundet

Förbundets storlek baseras på storleken på den största medlemmen i förbundet.

Låt oss förstå genom ett exempel.

 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 vet är storleken på int 4 byte, storleken på char är 1 byte, storleken på float är 4 byte och storleken på dubbel är 8 byte. Eftersom den dubbla variabeln upptar det största minnet av alla fyra variablerna, kommer totalt 8 byte att allokeras i minnet. Därför skulle utdata från ovanstående program vara 8 byte.

Tillgång till medlemmar i fackföreningen med hjälp av pekare

Vi kan komma åt förbundets medlemmar genom pekare genom att använda (->) piloperatorn.

Låt oss förstå genom ett exempel.

 #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 koden ovan har vi skapat en pekarvariabel, det vill säga *ptr, som lagrar adressen till variabeln var. Nu kan ptr komma åt variabeln 'a' genom att använda (->) operatorn. Därför skulle utmatningen av ovanstående kod vara 90.

dijkstra

Varför behöver vi C-förbund?

Betrakta ett exempel för att förstå behovet av C-förbund. Låt oss överväga en butik som har två artiklar:

  • Böcker
  • Skjortor

Butiksägare vill lagra register över de två ovan nämnda artiklarna tillsammans med relevant information. Böcker inkluderar till exempel titel, författare, antal sidor, pris och skjortor inkluderar färg, design, storlek och pris. Egenskapen 'pris' är vanlig i båda objekten. Butiksägaren vill lagra fastigheterna, sedan hur han/hon kommer att lagra uppgifterna.

Till en början bestämde de sig för att lagra posterna i en struktur som visas nedan:

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

Ovanstående struktur består av alla föremål som butiksägaren vill lagra. Ovanstående struktur är helt användbar men priset är gemensam egendom i både föremålen och resten av föremålen är individuella. Egenskaperna som pris, *titel, *författare och antal_sidor tillhör böcker medan färg, storlek, *design tillhör Skjorta.

Låt oss se hur vi kan komma åt medlemmarna i strukturen .

java sträng till int konvertering
 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 ovanstående kod har vi skapat en variabel av typen Lagra . Vi har tilldelat värdena till variablerna, titel, författare, antal_sidor, pris men bokvariabeln har inte egenskaper som storlek, färg och design. Därför är det ett slöseri med minne. Storleken på ovanstående struktur skulle vara 44 byte.

Vi kan spara mycket utrymme om vi använder fackföreningar.

 #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 ovanstående kod har vi skapat en variabel av typen butik. Eftersom vi använde fackföreningarna i ovanstående kod, så skulle det största minnet som upptas av variabeln övervägas för minnesallokeringen. Utdata från ovanstående program är 32 byte. När det gäller strukturer erhöll vi 44 byte, medan i fallet med fackföreningar erhålls storleken 44 byte. Därför är 44 byte större än 32 byte vilket sparar mycket minnesutrymme.