logo

Unie v C

svaz lze definovat jako uživatelsky definovaný datový typ, který je sbírkou různých proměnných různých datových typů ve stejném paměťovém místě. Svaz může být také definován jako mnoho členů, ale pouze jeden člen může obsahovat hodnotu v určitém časovém okamžiku.

Union je uživatelsky definovaný datový typ, ale na rozdíl od struktur sdílí stejné paměťové místo.

Pojďme to pochopit na příkladu.

linuxová architektura
 struct abc { int a; char b; } 

Výše uvedený kód je uživatelsky definovaná struktura, která se skládá ze dvou členů, tj. typu „a“. int a 'b' typu charakter . Když jsme zkontrolovali adresy 'a' a 'b', zjistili jsme, že se jejich adresy liší. Proto docházíme k závěru, že členy ve struktuře nesdílejí stejné paměťové místo.

Když definujeme sjednocení, pak jsme zjistili, že sjednocení je definováno stejným způsobem, jako je definována struktura, ale rozdíl je v tom, že klíčové slovo union se používá pro definování datového typu sjednocení, zatímco klíčové slovo struct se používá pro definici struktury. Sjednocení obsahuje datové členy, tj. 'a' a 'b', když zkontrolujeme adresy obou proměnných, pak jsme zjistili, že obě mají stejné adresy. To znamená, že členové odborů sdílejí stejné paměťové místo.

Podívejme se na obrázkové znázornění alokace paměti.

Níže uvedený obrázek ukazuje obrázkové znázornění struktury. Konstrukce má dva členy; tj. jeden je celočíselného typu a druhý je znakového typu. Protože 1 blok se rovná 1 bajtu; proto proměnné 'a' budou přiděleny 4 bloky paměti, zatímco proměnné 'b' bude přidělen 1 blok paměti.

Níže uvedený obrázek ukazuje obrázkové znázornění členů odborů. Obě proměnné sdílejí stejné umístění v paměti a mají stejnou počáteční adresu.

V odboru budou členové sdílet umístění paměti. Pokud se pokusíme provést změny v některém z členů, projeví se to i u druhého člena. Pojďme pochopit tento koncept na příkladu.

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

Ve výše uvedeném kódu má unie dva členy, tj. „a“ a „b“. 'var' je proměnná typu union abc. V hlavní() metodě, přiřadíme 66 do proměnné 'a', takže var.a vytiskne 66 na obrazovku. Protože 'a' i 'b' sdílejí umístění paměti, var.b vytiskne ' B (kód ASCII 66).

Rozhodování o velikosti svazu

Velikost svazu se odvíjí od velikosti největšího člena svazu.

Pojďme to pochopit na příkladu.

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

Jak víme, velikost int je 4 bajty, velikost char je 1 bajt, velikost float je 4 bajty a velikost double je 8 bajtů. Protože proměnná double zabírá největší paměť ze všech čtyř proměnných, bude v paměti alokováno celkem 8 bajtů. Proto by výstup výše uvedeného programu byl 8 bajtů.

Přístup k členům unie pomocí ukazatelů

Ke členům unie můžeme přistupovat přes ukazatele pomocí operátoru šipky (->).

Pojďme to pochopit na příkladu.

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

Ve výše uvedeném kódu jsme vytvořili proměnnou ukazatele, tj. *ptr, která ukládá adresu proměnné var. Nyní může ptr přistupovat k proměnné 'a' pomocí operátoru (->). Výstup výše uvedeného kódu by tedy byl 90.

sts ke stažení

Proč potřebujeme odbory C?

Zvažte jeden příklad, abyste pochopili potřebu svazků C. Uvažujme obchod, který má dvě položky:

  • knihy
  • Košile

Majitelé prodejen chtějí uchovávat záznamy o výše uvedených dvou položkách spolu s příslušnými informacemi. Například knihy obsahují název, autora, počet stran, cenu a košile zahrnují barvu, design, velikost a cenu. Vlastnost 'cena' je společná pro obě položky. Majitel obchodu chce uložit vlastnosti, pak jak bude ukládat záznamy.

Zpočátku se rozhodli uložit záznamy ve struktuře, jak je uvedeno níže:

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

Výše uvedená struktura se skládá ze všech položek, které chce majitel obchodu uložit. Výše uvedená struktura je plně použitelná, ale cena je společným majetkem obou položek a zbytek položek je individuální. Vlastnosti jako cena, *název, *autor a počet_stránek patří ke Knihám, zatímco barva, velikost, *design patří košili.

Podívejme se, jak můžeme přistupovat ke členům struktury .

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

Ve výše uvedeném kódu jsme vytvořili proměnnou typu obchod . Hodnoty jsme přiřadili proměnným, název, autor, počet_stránek, cena, ale proměnná kniha nemá vlastnosti, jako je velikost, barva a design. Jde tedy o plýtvání pamětí. Velikost výše uvedené struktury by byla 44 bajtů.

Pokud použijeme odbory, můžeme ušetřit spoustu místa.

java regex $
 #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; } 

Ve výše uvedeném kódu jsme vytvořili proměnnou typu store. Vzhledem k tomu, že jsme použili sjednocení ve výše uvedeném kódu, byla by pro alokaci paměti uvažována největší paměť obsazená proměnnou. Výstup výše uvedeného programu je 32 bajtů. V případě struktur jsme získali 44 bajtů, zatímco v případě sjednocení je získaná velikost 44 bajtů. 44 bajtů je tedy větší než 32 bajtů, což šetří spoustu místa v paměti.