logo

Unioni C:ssä

liitto voidaan määritellä käyttäjän määrittämäksi tietotyypiksi, joka on kokoelma eri tietotyyppejä eri muuttujia samassa muistipaikassa. Liitto voidaan määritellä myös useiksi jäseniksi, mutta vain yksi jäsen voi sisältää arvon tietyllä hetkellä.

Unioni on käyttäjän määrittämä tietotyyppi, mutta toisin kuin rakenteet, niillä on sama muistipaikka.

merkkijono itn

Ymmärretään tämä esimerkin kautta.

 struct abc { int a; char b; } 

Yllä oleva koodi on käyttäjän määrittämä rakenne, joka koostuu kahdesta jäsenestä, eli 'a'-tyyppisestä int ja 'b'-tyyppinen merkki . Kun tarkistamme 'a':n ja 'b'n osoitteet, havaitsimme, että niiden osoitteet ovat erilaisia. Siksi päättelemme, että rakenteen jäsenet eivät jaa samaa muistipaikkaa.

Kun määrittelemme liiton, havaitsimme, että liitto määritellään samalla tavalla kuin rakenne, mutta erona on, että union-avainsanaa käytetään liiton tietotyypin määrittämiseen, kun taas struct-avainsanaa käytetään rakenteen määrittämiseen. Liitto sisältää datajäsenet, eli 'a' ja 'b', kun tarkistamme molempien muuttujien osoitteet, havaitsimme, että molemmilla on samat osoitteet. Se tarkoittaa, että liiton jäsenet jakavat saman muistipaikan.

Katsotaanpa kuvallista esitystä muistin allokoinnista.

Alla olevassa kuvassa on kuvallinen esitys rakenteesta. Rakenteessa on kaksi jäsentä; eli yksi on kokonaislukutyyppinen ja toinen merkkityyppinen. Koska 1 lohko on yhtä suuri kuin 1 tavu; siksi 'a'-muuttujalle varataan 4 muistilohkoa, kun taas 'b'-muuttujalle varataan 1 muistilohko.

Alla olevassa kuvassa on kuvattu ammattiliiton jäseniä. Molemmat muuttujat jakavat saman muistipaikan ja niillä on sama aloitusosoite.

pete davidsonin kansalaisuus

Liitossa jäsenet jakavat muistipaikan. Jos yritämme tehdä muutoksia johonkin jäseneen, se heijastuu myös toiseen jäseneen. Ymmärretään tämä käsite esimerkin kautta.

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

Yllä olevassa koodissa liitolla on kaksi jäsentä, eli 'a' ja 'b'. 'var' on union abc -tyypin muuttuja. Vuonna pää() menetelmällä määritämme 66:n 'a'-muuttujalle, joten var.a tulostaa 66 näytölle. Koska sekä 'a' että 'b' jakavat muistipaikan, var.b tulee tulostamaan' B ' (ascii-koodi 66).

Liiton koon päättäminen

Liiton koko perustuu liiton suurimman jäsenen kokoon.

Ymmärretään esimerkin kautta.

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

Kuten tiedämme, int:n koko on 4 tavua, charin koko on 1 tavu, floatin koko on 4 tavua ja doublen koko on 8 tavua. Koska kaksoismuuttuja vie suurimman muistin kaikista neljästä muuttujasta, muistiin varataan yhteensä 8 tavua. Siksi yllä olevan ohjelman tuloste olisi 8 tavua.

Pääsy liiton jäseniin osoittimien avulla

Pääsemme liiton jäseniin osoittimien kautta käyttämällä (->) -nuolioperaattoria.

Ymmärretään esimerkin kautta.

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

Yllä olevaan koodiin olemme luoneet osoitinmuuttujan, eli *ptr, joka tallentaa var-muuttujan osoitteen. Nyt ptr voi käyttää muuttujaa 'a' käyttämällä (->) -operaattoria. Siksi yllä olevan koodin tulos olisi 90.

Miksi tarvitsemme C-liittoja?

Harkitse yhtä esimerkkiä ymmärtääksesi C-liittojen tarpeen. Ajatellaanpa kauppaa, jossa on kaksi tuotetta:

  • Kirjat
  • Paidat

Liikkeiden omistajat haluavat tallentaa yllämainittujen kahden kohteen tietueet asiaankuuluvien tietojen kanssa. Esimerkiksi kirjat sisältävät otsikon, tekijän, sivujen lukumäärän, hinnan ja paidat sisältävät värin, suunnittelun, koon ja hinnan. Hinta-ominaisuus on yhteinen molemmissa kohteissa. Liikkeen omistaja haluaa tallentaa kiinteistöt, sitten miten hän tallentaa tietueita.

Aluksi he päättivät tallentaa tietueet alla olevan kuvan mukaisesti:

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

Yllä oleva rakenne koostuu kaikista kohteista, jotka kaupan omistaja haluaa tallentaa. Yllä oleva rakenne on täysin käyttökelpoinen, mutta hinta on yhteistä omaisuutta sekä kohteissa että loput tavarat ovat yksilöllisiä. Ominaisuudet, kuten hinta, *title, *author ja number_pages, kuuluvat Booksille, kun taas väri, koko, *design kuuluvat Shirtille.

Katsotaanpa, kuinka pääsemme käsiksi rakenteen jäseniin .

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

Yllä olevaan koodiin olemme luoneet tyyppisen muuttujan tallentaa . Olemme määrittäneet arvot muuttujille, otsikolle, tekijälle, sivujen lukumäärälle, hinnalle, mutta kirjamuuttujalla ei ole ominaisuuksia, kuten koko, väri ja muotoilu. Siksi se on muistin tuhlausta. Yllä olevan rakenteen koko olisi 44 tavua.

Voimme säästää paljon tilaa, jos käytämme ammattiliittoja.

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

Yllä olevaan koodiin olemme luoneet muuttujan, jonka tyyppi on store. Koska käytimme liitoksia yllä olevassa koodissa, niin suurin muuttujan käyttämä muisti otetaan huomioon muistin varaamisessa. Yllä olevan ohjelman lähtö on 32 tavua. Rakenteiden tapauksessa saimme 44 tavua, kun taas unionien tapauksessa saatu koko on 44 tavua. Näin ollen 44 tavua on suurempi kuin 32 tavua, mikä säästää paljon muistitilaa.