logo

Union v C

únie môže byť definovaný ako užívateľsky definovaný dátový typ, ktorý je súborom rôznych premenných rôznych dátových typov v rovnakom pamäťovom mieste. Zväz môže byť definovaný aj ako mnoho členov, ale iba jeden člen môže obsahovať hodnotu v určitom časovom bode.

Union je užívateľsky definovaný dátový typ, ale na rozdiel od štruktúr zdieľajú rovnaké pamäťové miesto.

Pochopme to na príklade.

 struct abc { int a; char b; } 

Vyššie uvedený kód je užívateľsky definovaná štruktúra, ktorá pozostáva z dvoch členov, t. j. typu „a“. int a „b“ typu charakter . Keď sme skontrolovali adresy „a“ ​​a „b“, zistili sme, že ich adresy sa líšia. Preto sme dospeli k záveru, že členovia v štruktúre nezdieľajú rovnaké pamäťové miesto.

Keď definujeme spojenie, potom sme zistili, že spojenie je definované rovnakým spôsobom, ako je definovaná štruktúra, ale rozdiel je v tom, že kľúčové slovo union sa používa na definovanie dátového typu spojenia, zatiaľ čo kľúčové slovo struct sa používa na definovanie štruktúry. Spojenie obsahuje dátové členy, t.j. 'a' a 'b', keď skontrolujeme adresy oboch premenných, potom sme zistili, že obe majú rovnaké adresy. Znamená to, že členovia odborov zdieľajú rovnaké pamäťové miesto.

Pozrime sa na obrázkové znázornenie alokácie pamäte.

Nižšie uvedený obrázok ukazuje obrazové znázornenie štruktúry. Štruktúra má dvoch členov; tj jeden je celočíselného typu a druhý je znakového typu. Pretože 1 blok sa rovná 1 bajtu; preto premennej „a“ budú pridelené 4 bloky pamäte, zatiaľ čo premennej „b“ bude pridelený 1 blok pamäte.

Nižšie uvedený obrázok znázorňuje obrazové znázornenie členov odborov. Obe premenné zdieľajú rovnaké miesto v pamäti a majú rovnakú počiatočnú adresu.

V odbore budú členovia zdieľať miesto v pamäti. Ak sa pokúsime vykonať zmeny v niektorom z členov, prejaví sa to aj v druhom členovi. Poďme pochopiť tento koncept prostredníctvom príkladu.

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

Vo vyššie uvedenom kóde má únia dvoch členov, t.j. „a“ a „b“. 'var' je premenná typu union abc. V Hlavná() metóde, priradíme 66 premennej 'a', takže var.a vypíše na obrazovku 66. Keďže 'a' aj 'b' zdieľajú miesto v pamäti, var.b vytlačí sa ' B “ (kód ascii 66).

Rozhodovanie o veľkosti únie

Veľkosť únie vychádza z veľkosti najväčšieho člena únie.

Poďme to pochopiť na príklade.

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

Ako vieme, veľkosť int je 4 bajty, veľkosť char je 1 bajt, veľkosť float je 4 bajty a veľkosť double je 8 bajtov. Keďže premenná double zaberá najväčšiu pamäť spomedzi všetkých štyroch premenných, v pamäti bude alokovaných celkovo 8 bajtov. Preto by výstup vyššie uvedeného programu bol 8 bajtov.

Prístup k členom únie pomocou ukazovateľov

K členom únie môžeme pristupovať cez ukazovatele pomocou operátora šípky (->).

Poďme to pochopiť na príklade.

 #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; } 

Vo vyššie uvedenom kóde sme vytvorili premennú ukazovateľa, t.j. *ptr, ktorá ukladá adresu premennej var. Teraz môže ptr pristupovať k premennej 'a' pomocou operátora (->). Výstup vyššie uvedeného kódu by teda bol 90.

Prečo potrebujeme odbory C?

Zvážte jeden príklad, aby ste pochopili potrebu zväzkov C. Zoberme si obchod, ktorý má dve položky:

  • knihy
  • Košele

Majitelia predajní chcú uchovávať záznamy o vyššie uvedených dvoch položkách spolu s príslušnými informáciami. Napríklad knihy zahŕňajú názov, autora, počet strán, cenu a košele zahŕňajú farbu, dizajn, veľkosť a cenu. Vlastnosť „cena“ je spoločná pre obe položky. Majiteľ obchodu chce uložiť vlastnosti, potom ako bude uchovávať záznamy.

Spočiatku sa rozhodli uložiť záznamy v štruktúre, ako je uvedené nižšie:

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

Vyššie uvedená štruktúra pozostáva zo všetkých položiek, ktoré chce majiteľ obchodu uložiť. Vyššie uvedená štruktúra je plne použiteľná, ale cena je spoločnou vlastnosťou oboch položiek a ostatné položky sú individuálne. Vlastnosti ako cena, *názov, *autor a počet_strán patria ku Knihám, zatiaľ čo farba, veľkosť, *dizajn patrí košeli.

Pozrime sa, ako môžeme získať prístup k členom štruktúry .

 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; } 

Vo vyššie uvedenom kóde sme vytvorili premennú typu obchod . Hodnoty sme priradili premenným, názov, autor, počet_strán, cena, ale premenná kniha nemá vlastnosti ako veľkosť, farba a dizajn. Ide teda o plytvanie pamäťou. Veľkosť vyššie uvedenej štruktúry by bola 44 bajtov.

Ak použijeme odbory, môžeme ušetriť veľa miesta.

 #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; } 

Vo vyššie uvedenom kóde sme vytvorili premennú typu store. Keďže sme vo vyššie uvedenom kóde použili zväzky, pri prideľovaní pamäte by sa brala do úvahy najväčšia pamäť obsadená premennou. Výstup vyššie uvedeného programu je 32 bajtov. V prípade štruktúr sme získali 44 bajtov, zatiaľ čo v prípade zjednotení je získaná veľkosť 44 bajtov. Preto je 44 bajtov viac ako 32 bajtov, čo šetrí veľa miesta v pamäti.