struct:n tapainen varattu sana on union, jolla tehdään päällekkäin olevia muistialueita, joilla on eri tilanteessa eri käyttö. Esimerkiksi henkilötietueessa naisilla voisi olla synnyttanyt_lapsia ja miehillä armeija_kayty, jotka jakaisivat saman muistialueen (huom. esimerkki tehty -91).
#include <stdio.h> Matti
---------------------------
typedef enum { | ------------- |
mies, |nimi: |M|a|t|t|i|0| |
nainen | ------------- |
} tSukupuoli; |sukupuoli:| 0 | |
| ----- |
typedef union { |tiedot: | 1 | |
int syn_lapsia; ---------------------------
int armeija_kayty; Maija
} tTiedot; ---------------------------
| ------------- |
typedef struct { |nimi: |M|a|i|j|a|0| |
char nimi[40]; | ------------- |
tSukupuoli sukupuoli; |sukupuoli:| 1 | |
tTiedot tiedot; | ----- |
} tHenkilo; |tiedot: | 4 | |
---------------------------
void tulosta_henkilo(tHenkilo *henkilo)
{
printf("Nimi: %- 40s\n",henkilo- >nimi);
switch (henkilo- >sukupuoli) {
case mies:
printf("Mies, armeija käyty: %d\n",henkilo- >tiedot.armeija_kayty);
break;
case nainen:
printf("Nainen, synnyttanyt lapsia: %d\n",henkilo- >tiedot.syn_lapsia);
break;
default: printf("Eunukki\n");
}
}
int main(void)
{
tHenkilo Matti = {"Matti",mies,1}, Maija = {"Maija",nainen,4};
tulosta_henkilo(&Matti);
tulosta_henkilo(&Maija);
return 0;
}
Tällä kurssilla emme kuitenkaan suosittele union- tyyppisten muuttujien käyttöä! Mieluummin käytämme olioita ja polymorfismia.
Edellä enum tarkoitti lueteltua tyyppiä, jolloin mies vastasi vakiota 0 ja nainen vakiota 1. Tähän palataan myöhemmin.
typedef struct {
char nimi[50];
int paino;
int ika;
} Elain_tiedot;
typedef struct {
char laji[40];
Elain_tiedot elain;
int nro;
} Laji_tiedot;
int main(void)
{
Laji_tiedot miuku;
...
return 0;
}
laji <- "Kissa" nro <- 5 nimi <- "Miuku" paino <- 3 ika <- 5