Table of Contents

PCLP Suport Teoretic pentru Laborator: Tipuri de date definite de utilizator - uniuni

Obiective

În urma parcurgerii acestui material studentul va fi capabil să:

Uniuni

Uniunile sunt asemănătoare structurilor, dar lor li se rezervă o zonă de memorie ce poate conţine, la momente de timp diferite, variabile de tipuri diferite. Sunt utilizate pentru a economisi memoria (se refoloseşte aceeaşi zonă de memorie pentru a stoca mai multe variabile).

Uniunile se pot declara astfel:

union numere {
  int i;
  float f;
  double v;
};              /* se poate utiliza si typedef... */
 
union numere u1, u2;

Când scriem ceva într-o uniune (de exemplu când facem o atribuire de genul u1.f = 7.4), ceea ce citim apoi trebuie să fie de acelaşi tip, altfel vom obţine rezultate eronate (adică trebuie să utilizam u1.f, nu u1.v sau u1.i). Programatorul trebuie să ţină evidenţa tipului variabilei care este memorată în uniune în momentul curent pentru a evita astfel de greşeli. Operaţiile care se pot face cu structuri se pot face şi cu uniuni; o structura poate conţine uniuni şi o uniune poate conţine structuri.

Exemplu:

#include <stdio.h>
#include <stdlib.h>
 
typedef union {
  int Wind_Chill;
  char Heat_Index;
} Condition;
 
typedef struct {
  float temp;
  Condition feels_like;
} Temperature;
 
int main() {
 
  Temperature *tmp;
  tmp = (Temperature *)malloc(sizeof(Temperature));
 
  printf("\nAddress of Temperature = %u", tmp);
  printf("\nAddress of temp = %u, feels_like = %u", 
                 &(*tmp).temp,&(*tmp).feels_like);
  printf("\nWind_Chill = %u, Heat_Index= %u\n", 
                 &((*tmp).feels_like).Wind_Chill,
                 &((*tmp).feels_like).Heat_Index);
 
  return 0;
}

La rulare va afişa:

Address of Temperature = 165496
Address of temp = 165496, feels_like = 165500
Wind_Chill = 165500, Heat_Index= 165500