logo

Sąjunga C

sąjunga gali būti apibrėžtas kaip vartotojo apibrėžtas duomenų tipas, kuris yra skirtingų skirtingų duomenų tipų kintamųjų rinkinys toje pačioje atminties vietoje. Sąjungą taip pat galima apibrėžti kaip daug narių, tačiau tik vienas narys gali turėti reikšmę tam tikru momentu.

Sąjunga yra vartotojo apibrėžtas duomenų tipas, tačiau skirtingai nuo struktūrų, jie turi tą pačią atminties vietą.

Supraskime tai per pavyzdį.

 struct abc { int a; char b; } 

Aukščiau pateiktas kodas yra vartotojo apibrėžta struktūra, kurią sudaro du nariai, t. y. „a“ tipo tarpt ir „b“ tipo charakteris . Kai patikrinome „a“ ir „b“ adresus, pastebėjome, kad jų adresai skiriasi. Todėl darome išvadą, kad struktūros nariai neturi tos pačios atminties vietos.

Kai apibrėžiame sąjungą, mes nustatėme, kad sąjunga apibrėžiama taip pat, kaip apibrėžta struktūra, tačiau skirtumas yra tas, kad sąjungos raktinis žodis naudojamas sąjungos duomenų tipui apibrėžti, o raktinis žodis struct naudojamas struktūrai apibrėžti. Sąjungą sudaro duomenų nariai, ty „a“ ​​ir „b“, kai patikriname abiejų kintamųjų adresus, tada nustatėme, kad abu turi tuos pačius adresus. Tai reiškia, kad sąjungos nariai turi tą pačią atminties vietą.

Pažvelkime į vaizdinį atminties paskirstymo vaizdą.

Žemiau esančiame paveikslėlyje parodytas vaizdinis konstrukcijos vaizdas. Struktūrą sudaro du nariai; y., vienas yra sveikųjų skaičių, o kitas yra simbolių tipo. Kadangi 1 blokas yra lygus 1 baitui; todėl „a“ kintamajam bus skirti 4 atminties blokai, o „b“ kintamajam – 1 atminties blokas.

Žemiau esančiame paveikslėlyje pavaizduoti sąjungos nariai. Abu kintamieji turi tą pačią atminties vietą ir turi tą patį pradinį adresą.

greitai rūšiuoti

Sąjungoje nariai dalinsis atminties vieta. Jei bandysime pakeisti bet kurį narį, tai atsispindės ir kitam nariui. Supraskime šią sąvoką per pavyzdį.

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

Aukščiau pateiktame kodekse sąjungą sudaro du nariai, ty „a“ ​​ir „b“. „Var“ yra sąjungos abc tipo kintamasis. Viduje pagrindinis () metodu, 66 priskiriame kintamajam „a“, todėl var.a ekrane išspausdins 66. Kadangi ir „a“, ir „b“ dalijasi atminties vieta, var.b atspausdins' B “ (66 ASCII kodas).

Profesinės sąjungos dydžio sprendimas

Profsąjungos dydis nustatomas pagal didžiausio sąjungos nario dydį.

Supraskime per pavyzdį.

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

Kaip žinome, int dydis yra 4 baitai, char dydis yra 1 baitas, float dydis yra 4 baitai, o double dydis yra 8 baitai. Kadangi dvigubas kintamasis užima didžiausią atmintį tarp visų keturių kintamųjų, iš viso atmintyje bus skirta 8 baitai. Todėl minėtos programos išvestis būtų 8 baitai.

Prieiga prie sąjungos narių naudojant nuorodas

Mes galime pasiekti sąjungos narius per rodykles naudodami (->) rodyklės operatorių.

Supraskime per pavyzdį.

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

Aukščiau pateiktame kode sukūrėme rodyklės kintamąjį, ty *ptr, kuris saugo var kintamojo adresą. Dabar ptr gali pasiekti kintamąjį „a“ naudodamas (->) operatorių. Taigi aukščiau pateikto kodo išvestis būtų 90.

pakeisti java eilutę

Kodėl mums reikalingos C sąjungos?

Apsvarstykite vieną pavyzdį, kad suprastumėte C sąjungų poreikį. Panagrinėkime parduotuvę, kurioje yra dvi prekės:

kažkas bf
  • Knygos
  • Marškiniai

Parduotuvių savininkai nori saugoti aukščiau paminėtų dviejų prekių įrašus kartu su atitinkama informacija. Pavyzdžiui, knygose yra pavadinimas, autorius, puslapių skaičius, kaina, o marškinėliai – spalva, dizainas, dydis ir kaina. „Kainos“ savybė būdinga abiem prekėms. Parduotuvės savininkas nori saugoti nuosavybę, tada kaip jis saugos įrašus.

Iš pradžių jie nusprendė saugoti įrašus tokioje struktūroje, kaip parodyta toliau:

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

Aukščiau pateiktą struktūrą sudaro visi daiktai, kuriuos parduotuvės savininkas nori saugoti. Aukščiau pateikta konstrukcija yra visiškai tinkama naudoti, tačiau kaina yra bendra tiek daiktų nuosavybė, tiek kiti daiktai yra individualūs. Tokios savybės kaip kaina, *pavadinimas, *autorius ir puslapių skaičius priklauso knygoms, o spalva, dydis, *dizainas priklauso marškinėliai.

Pažiūrėkime, kaip galime pasiekti struktūros narius .

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

Aukščiau pateiktame kode sukūrėme tipo kintamąjį parduotuvė . Priskyrėme reikšmes kintamiesiems, pavadinimui, autoriui, puslapių skaičiui, kainai, tačiau knygos kintamasis neturi tokių savybių kaip dydis, spalva ir dizainas. Vadinasi, tai atminties švaistymas. Aukščiau pateiktos struktūros dydis būtų 44 baitai.

Mes galime sutaupyti daug vietos, jei naudosime sąjungas.

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

Aukščiau pateiktame kode sukūrėme parduotuvės tipo kintamąjį. Kadangi aukščiau pateiktame kode naudojome jungtis, todėl paskirstant atmintį būtų atsižvelgta į didžiausią kintamojo užimtą atmintį. Aukščiau pateiktos programos išvestis yra 32 baitai. Struktūrų atveju gavome 44 baitus, o jungčių atveju gautas dydis yra 44 baitai. Taigi 44 baitai yra didesni nei 32 baitai, taigi sutaupoma daug vietos atmintyje.