logo

Unió a C

Unió es pot definir com un tipus de dades definit per l'usuari que és una col·lecció de diferents variables de diferents tipus de dades en la mateixa ubicació de memòria. La unió també es pot definir com a molts membres, però només un membre pot contenir un valor en un moment determinat.

Union és un tipus de dades definit per l'usuari, però a diferència de les estructures, comparteixen la mateixa ubicació de memòria.

Entenem-ho a través d'un exemple.

 struct abc { int a; char b; } 

El codi anterior és l'estructura definida per l'usuari que consta de dos membres, és a dir, 'a' de tipus int i 'b' de tipus personatge . Quan comprovem les adreces de 'a' i 'b', vam trobar que les seves adreces són diferents. Per tant, concloem que els membres de l'estructura no comparteixen la mateixa ubicació de memòria.

Quan definim la unió, vam trobar que la unió es defineix de la mateixa manera que es defineix l'estructura, però la diferència és que la paraula clau unió s'utilitza per definir el tipus de dades d'unió, mentre que la paraula clau struct s'utilitza per definir l'estructura. La unió conté els membres de dades, és a dir, 'a' i 'b', quan comprovem les adreces de les dues variables, vam trobar que totes dues tenen les mateixes adreces. Vol dir que els membres del sindicat comparteixen la mateixa ubicació de memòria.

Fem una ullada a la representació pictòrica de l'assignació de memòria.

exemples dfa

La figura següent mostra la representació pictòrica de l'estructura. L'estructura té dos membres; és a dir, un és de tipus sencer i l'altre és de tipus caràcter. Com que 1 bloc és igual a 1 byte; per tant, a la variable 'a' se li assignarà 4 blocs de memòria mentre que a la variable 'b' se li assignarà 1 bloc de memòria.

La figura següent mostra la representació pictòrica dels membres del sindicat. Ambdues variables comparteixen la mateixa ubicació de memòria i tenen la mateixa adreça inicial.

text d'ajustament css

En unió, els membres compartiran la ubicació de la memòria. Si intentem fer canvis en algun dels membres, també es reflectirà a l'altre membre. Entenem aquest concepte a través d'un exemple.

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

En el codi anterior, el sindicat té dos membres, és a dir, 'a' i 'b'. La 'var' és una variable de tipus union abc. En el principal () mètode, assignem el 66 a la variable 'a', de manera que var.a imprimirà 66 a la pantalla. Com que 'a' i 'b' comparteixen la ubicació de memòria, var.b imprimirà' B ' (codi ascii de 66).

Decidir la mida del sindicat

La mida del sindicat es basa en la mida del membre més gran del sindicat.

Entenem-ho a través d'un exemple.

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

Com sabem, la mida de int és de 4 bytes, la mida de char és d'1 byte, la mida de float és de 4 bytes i la mida de double és de 8 bytes. Com que la variable doble ocupa la memòria més gran entre les quatre variables, s'assignaran un total de 8 bytes a la memòria. Per tant, la sortida del programa anterior seria de 8 bytes.

Accés als membres del sindicat mitjançant punters

Podem accedir als membres de la unió mitjançant punters mitjançant l'operador de fletxa (->).

Entenem-ho a través d'un exemple.

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

Al codi anterior, hem creat una variable punter, és a dir, *ptr, que emmagatzema l'adreça de la variable var. Ara, ptr pot accedir a la variable 'a' mitjançant l'operador (->). Per tant, la sortida del codi anterior seria 90.

Per què necessitem els sindicats C?

Considereu un exemple per entendre la necessitat de les unions C. Considerem una botiga que té dos articles:

java substituir-ho tot
  • Llibres
  • Camises

Els propietaris de botigues volen emmagatzemar els registres dels dos elements esmentats anteriorment juntament amb la informació rellevant. Per exemple, els llibres inclouen el títol, l'autor, el nombre de pàgines, el preu i les samarretes inclouen el color, el disseny, la mida i el preu. La propietat 'preu' és comuna en ambdós articles. El propietari de la botiga vol emmagatzemar les propietats i després com emmagatzemarà els registres.

Inicialment, van decidir emmagatzemar els registres en una estructura com es mostra a continuació:

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

L'estructura anterior consta de tots els articles que el propietari de la botiga vol emmagatzemar. L'estructura anterior és completament utilitzable, però el preu és propietat comuna tant en els articles com en la resta d'articles són individuals. Les propietats com el preu, *títol, *autor i número_páginas pertanyen a Llibres, mentre que el color, la mida i el *disseny pertanyen a Camisa.

Vegem com podem accedir als membres de l'estructura .

convertir cadena a int java
 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; } 

En el codi anterior, hem creat una variable de tipus botiga . Hem assignat els valors a les variables, títol, autor, nombre_pàgines, preu, però la variable llibre no té propietats com ara la mida, el color i el disseny. Per tant, és un malbaratament de memòria. La mida de l'estructura anterior seria de 44 bytes.

Podem estalviar molt d'espai si fem servir sindicats.

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

En el codi anterior, hem creat una variable de tipus store. Com que hem utilitzat les unions en el codi anterior, per a l'assignació de memòria es consideraria la memòria més gran ocupada per la variable. La sortida del programa anterior és de 32 bytes. En el cas de les estructures, hem obtingut 44 bytes, mentre que en el cas de les unions, la mida obtinguda és de 44 bytes. Per tant, 44 bytes són més grans que 32 bytes estalviant molt espai de memòria.