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