logo

Unirea în C

Uniune poate fi definit ca un tip de date definit de utilizator, care este o colecție de variabile diferite de diferite tipuri de date în aceeași locație de memorie. Uniunea poate fi definită și ca mai mulți membri, dar un singur membru poate conține o valoare la un anumit moment în timp.

Union este un tip de date definit de utilizator, dar, spre deosebire de structuri, acestea au aceeași locație de memorie.

Să înțelegem asta printr-un exemplu.

 struct abc { int a; char b; } 

Codul de mai sus este structura definită de utilizator care constă din doi membri, adică „a” de tip int și „b” de tip caracter . Când verificăm adresele lui „a” și „b”, am constatat că adresele lor sunt diferite. Prin urmare, concluzionăm că membrii din structură nu au aceeași locație de memorie.

Când definim uniunea, atunci am constatat că uniunea este definită în același mod în care este definită structura, dar diferența este că cuvântul cheie union este folosit pentru definirea tipului de date union, în timp ce cuvântul cheie struct este folosit pentru definirea structurii. Uniunea conține membrii datelor, adică „a” și „b”, când verificăm adresele ambelor variabile, atunci am descoperit că ambele au aceleași adrese. Înseamnă că membrii de sindicat au aceeași locație de memorie.

Să aruncăm o privire la reprezentarea picturală a alocării memoriei.

Figura de mai jos prezintă reprezentarea picturală a structurii. Structura are doi membri; adică, unul este de tip întreg, iar celălalt este de tip caracter. Deoarece 1 bloc este egal cu 1 octet; prin urmare, variabilei „a” i se vor aloca 4 blocuri de memorie, în timp ce variabilei „b” i se va aloca 1 bloc de memorie.

Figura de mai jos prezintă reprezentarea picturală a membrilor de sindicat. Ambele variabile partajează aceeași locație de memorie și au aceeași adresă inițială.

În unire, membrii vor împărtăși locația de memorie. Dacă încercăm să facem modificări în oricare dintre membri, atunci acestea se vor reflecta și asupra celuilalt membru. Să înțelegem acest concept printr-un exemplu.

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

În codul de mai sus, uniunea are doi membri, adică „a” și „b”. „var” este o variabilă de tip union abc. În principal() metoda, atribuim 66 variabilei „a”, deci var.a va imprima 66 pe ecran. Deoarece atât „a” cât și „b” partajează locația de memorie, var.b va imprima ' B ' (cod ascii de 66).

Decizia mărimii sindicatului

Mărimea sindicatului se bazează pe mărimea celui mai mare membru al sindicatului.

Să înțelegem printr-un exemplu.

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

După cum știm, dimensiunea int este de 4 octeți, dimensiunea caracterului este de 1 octet, dimensiunea float este de 4 octeți și dimensiunea lui double este de 8 octeți. Deoarece variabila dublă ocupă cea mai mare memorie dintre toate cele patru variabile, deci vor fi alocați în memorie un total de 8 octeți. Prin urmare, rezultatul programului de mai sus ar fi de 8 octeți.

Accesarea membrilor sindicatului folosind pointeri

Putem accesa membrii uniunii prin pointere folosind operatorul săgeată (->).

Să înțelegem printr-un exemplu.

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

În codul de mai sus, am creat o variabilă pointer, adică *ptr, care stochează adresa variabilei var. Acum, ptr poate accesa variabila „a” folosind operatorul (->). Prin urmare, rezultatul codului de mai sus ar fi 90.

De ce avem nevoie de sindicate C?

Luați în considerare un exemplu pentru a înțelege necesitatea uniunilor C. Să luăm în considerare un magazin care are două articole:

  • Cărți
  • Cămăși

Proprietarii de magazine doresc să stocheze înregistrările celor două articole menționate mai sus împreună cu informațiile relevante. De exemplu, Cărțile includ titlul, autorul, numărul de pagini, prețul, iar cămășile includ culoarea, designul, dimensiunea și prețul. Proprietatea „preț” este comună în ambele articole. Proprietarul magazinului dorește să stocheze proprietățile, apoi cum va stoca înregistrările.

Inițial, au decis să stocheze înregistrările într-o structură după cum se arată mai jos:

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

Structura de mai sus constă din toate articolele pe care proprietarul magazinului dorește să le depoziteze. Structura de mai sus este complet utilizabilă, dar prețul este proprietate comună atât pentru articole, cât și pentru restul articolelor sunt individuale. Proprietățile precum prețul, *title, *author și number_pages aparțin Cărților, în timp ce culoarea, dimensiunea, *designul aparțin Cămășii.

Să vedem cum putem accesa membrii structurii .

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

În codul de mai sus, am creat o variabilă de tip magazin . Am atribuit valorile variabilelor, titlu, autor, număr_pagini, preț, dar variabila carte nu are proprietăți precum dimensiunea, culoarea și designul. Prin urmare, este o risipă de memorie. Dimensiunea structurii de mai sus ar fi de 44 de octeți.

Putem economisi mult spațiu dacă folosim sindicate.

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

În codul de mai sus, am creat o variabilă de tip magazin. Deoarece am folosit uniunile din codul de mai sus, pentru alocarea memoriei ar fi luată în considerare cea mai mare memorie ocupată de variabilă. Ieșirea programului de mai sus este de 32 de octeți. În cazul structurilor, am obținut 44 de octeți, în timp ce în cazul uniunilor, dimensiunea obținută este de 44 de octeți. Prin urmare, 44 de octeți este mai mare decât 32 de octeți, economisind mult spațiu de memorie.