logo

Unija u C

Unija može se definirati kao korisnički definiran tip podataka koji je skup različitih varijabli različitih tipova podataka na istoj memorijskoj lokaciji. Unija se također može definirati kao više članova, ali samo jedan član može sadržavati vrijednost u određenom trenutku u vremenu.

android proces acore stalno se zaustavlja

Union je tip podataka koji definira korisnik, ali za razliku od struktura, oni dijele istu memorijsku lokaciju.

Shvatimo ovo kroz primjer.

 struct abc { int a; char b; } 

Gornji kod je korisnički definirana struktura koja se sastoji od dva člana, tj. 'a' tipa int i 'b' tipa lik . Kada smo provjerili adrese 'a' i 'b', otkrili smo da su njihove adrese različite. Stoga zaključujemo da članovi u strukturi ne dijele istu memorijsku lokaciju.

Kada smo definirali uniju, otkrili smo da je unija definirana na isti način kao što je definirana struktura, ali razlika je u tome što se ključna riječ union koristi za definiranje tipa podataka union, dok se ključna riječ struct koristi za definiranje strukture. Unija sadrži članove podataka, tj. 'a' i 'b', kada provjerimo adrese obiju varijabli, otkrili smo da obje imaju iste adrese. To znači da članovi unije dijele istu memorijsku lokaciju.

Pogledajmo slikovni prikaz raspodjele memorije.

Donja slika prikazuje slikovni prikaz strukture. Struktura ima dva člana; tj. jedan je cjelobrojnog, a drugi znakovnog tipa. Pošto je 1 blok jednak 1 bajtu; stoga će varijabli 'a' biti dodijeljena 4 bloka memorije dok će varijabli 'b' biti dodijeljen 1 blok memorije.

Na donjoj slici prikazan je slikovni prikaz članova sindikata. Obje varijable dijele istu memorijsku lokaciju i imaju istu početnu adresu.

pete davidson nacionalnosti

U uniji će članovi dijeliti memorijsku lokaciju. Ako pokušamo napraviti promjene u bilo kojem članu, to će se odraziti i na drugog člana. Razumimo ovaj koncept kroz primjer.

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

U gornjem kodu, unija ima dva člana, tj. 'a' i 'b'. 'Var' je varijabla tipa unije abc. u glavni() metodom, 66 dodjeljujemo varijabli 'a', tako da će var.a ispisati 66 na ekranu. Budući da i 'a' i 'b' dijele memorijsku lokaciju, var.b ispisat će ' B ' (ascii kod od 66).

Odlučivanje o veličini sindikata

Veličina sindikata temelji se na veličini najvećeg člana sindikata.

Shvatimo kroz primjer.

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

Kao što znamo, veličina int je 4 bajta, veličina char je 1 bajt, veličina float je 4 bajta, a veličina double je 8 bajtova. Budući da varijabla double zauzima najveću memoriju među sve četiri varijable, ukupno će 8 bajtova biti alocirano u memoriji. Stoga bi izlaz gornjeg programa bio 8 bajtova.

10 posto od 60

Pristup članovima unije pomoću pokazivača

Članovima unije možemo pristupiti preko pokazivača pomoću operatora strelice (->).

Shvatimo kroz primjer.

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

U gornjem kodu stvorili smo varijablu pokazivača, tj. *ptr, koja pohranjuje adresu varijable var. Sada ptr može pristupiti varijabli 'a' pomoću (->) operatora. Stoga bi rezultat gornjeg koda bio 90.

Zašto su nam potrebni C sindikati?

Razmotrite jedan primjer kako biste razumjeli potrebu za C sindikatima. Razmotrimo trgovinu koja ima dvije stavke:

  • knjige
  • Košulje

Vlasnici trgovina žele pohraniti zapise o gore spomenute dvije stavke zajedno s relevantnim informacijama. Na primjer, knjige uključuju naslov, autora, broj stranica, cijenu, a košulje uključuju boju, dizajn, veličinu i cijenu. Svojstvo 'cijena' zajedničko je u obje stavke. Vlasnik trgovine želi pohraniti svojstva, zatim kako će on/ona pohraniti zapise.

U početku su odlučili pohraniti zapise u strukturi prikazanoj u nastavku:

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

Gornja struktura sastoji se od svih stavki koje vlasnik trgovine želi pohraniti. Gornja struktura je u potpunosti iskoristiva, ali cijena je zajednička u obje stavke, a ostale stavke su pojedinačne. Svojstva kao što su cijena, *naslov, *autor i broj_stranica pripadaju knjigama, dok boja, veličina, *dizajn pripadaju košulji.

Pogledajmo kako možemo pristupiti članovima strukture .

cjelobrojna usporedba s Javom
 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; } 

U gornjem kodu stvorili smo varijablu tipa trgovina . Dodijelili smo vrijednosti varijablama, naslovu, autoru, broju_stranica, cijeni, ali varijabla knjige ne posjeduje svojstva kao što su veličina, boja i dizajn. Dakle, to je gubitak memorije. Veličina gornje strukture bila bi 44 bajta.

Možemo uštedjeti puno prostora ako koristimo sindikate.

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

U gornjem kodu stvorili smo varijablu tipa store. Budući da smo koristili unije u gornjem kodu, najveća memorija koju zauzima varijabla bi se uzela u obzir za dodjelu memorije. Izlaz gornjeg programa je 32 bajta. U slučaju struktura dobili smo 44 bajta, dok je u slučaju unija dobivena veličina 44 bajta. Dakle, 44 bajta je više od 32 bajta čime se štedi puno memorijskog prostora.