Používání struktur a unií

Přehled informací

Datový typ struct

Struktura je heterogenní objektový datový typ. To znamená, že datový typ struktura je složen z různých datových typů. Navenek vystupuje struktura jako jeden objekt. Prvky struktury jsou implicitně veřejné (public).

Syntaxe deklarace struktury

  struct [jmenovka]
  {
    Typ1 prvek1;
    Typ2 prvek2;
      ... 
  } [proměnná1, proměnná2, ...];

Argumenty deklarace struktury

jmenovka
Nepovinná. Je-li uvedena jedná se o deklaraci struktury, jehož jméno bude jmenovka. Není-li jmenovka uvedena, musí být uvedena alespoň jedna proměnná tohoto typu.
Typ1 prvek1
Složky struktury - proměnné, funkce a prototypy.
proměnná
Nepovinné, definice proměnných, ukazatelů na ně atd. tohoto typu (vytvářeného typu struktura). Lze je definovat i později.

Poznámka - odkaz struktury na sebe samu

Struktura nemůže obsahovat ve svém těle proměnnou vlastního typu. Toto omezení lze obejít použitím ukazatele nebo reference na proměnnou typu struktura.

Příklad vytvoření struktury

  struct auto
  {
    char vyrobce[20];
    char typ[20];
    int rychlost;
    int cena;
    void tisk_informaci(int);
  };

Práce se strukturami

Definice proměnné typu struktura

Strukturové proměnné lze definovat buď přímo v deklaraci struktury nebo později pomocí identifikátoru (jména) struktury. V případě, že není uveden identifikátor struktury při její deklaraci, nelze později definovat proměnné typu této struktury.

  struct auto
  {
    char vyrobce[20];
    char typ[20];
    int rychlost;
    int cena;
    void tisk_informaci(int);
  };

  auto Felicie;     // vytvoření proměnné typu struktura auto

Inicializace struktury

Struktury je možné, podobně jako pole, inicializovat přímo při definici. Stačí vypsat seznam inicializačních hodnot do složených závorek. Hodnoty musí být odděleny čárkami. Obdobně jako u pole není nutné inicializovat všechny prvky struktury. Platí omezení, že prázdné prvky musí být umístěny v souvislém bloku na konci struktury.

Příklad inicializace struktury auto

  auto Felicie = {"Škoda", "Felicie", 155, 240000};
      // ukázka inicializace hodnot při definici

Přístup k prvkům struktury

K prvkům struktury je možné přistupovat dvěma způsoby. Jejich použití je závislé na tom, zda máme k dispozici proměnnou strukturového typu nebo ukazatel na proměnnou strukturového typu. Přistupujeme-li k prvku struktury přes proměnnou strukturového typu použijeme konstrukci:

  strukturová_proměnná . prvek_struktury

Přistupujeme-li k prvku struktury přes ukazatel na strukturovou proměnnou použimeme konstrukci:

  ukazatel_na_strukturovou_proměnnou -> prvek_struktury

Příklad změny a získání hodnoty z prvků struktury

  struct auto
  {
    char vyrobce[20];
    char typ[20];
    int rychlost;
    int cena;
    void tisk_informaci(int);
  };

  void main()
  {
    auto Felicie;  
        // definice proměnné typu struktura
    auto *Felicie;    
        // definice proměnné typu ukazatel na strukturu
      
    pFelicie = &Felicie;
        // nastavení ukazatele na proměnnou Felicie
      
    Felicie.rychlost = 156;
    pFelicie->cena = 240000;
    strcpy(Felicie.typ,"Felicie");
    strcpy(pFelicie->vyrobce,"Škoda");
    printf("Vyrobce: %s, typ: %s, rychlost: %d, cena: %d\n", 
            Felicie.vyrobce, Felicie.typ, 
            Felicie.rychlost, Felicie.cena
          );
    printf("Vyrobce: %s, typ: %s, rychlost: %d, cena: %d\n", 
            pFelicie->vyrobce, pFelicie->typ, 
            pFelicie->rychlost, pFelicie->cena
          );
  }

Programová konstrukce při použití procedury ukazující na sebe

Při programování se jistě dostanete do situace, kdy budete potřebovat vytvořit strukturu, která by měla odkazovat sama na sebe. Tento případ nastane například při tvorbě zřetězeného seznamu. Programovací jazyk, ale neumožňuje odkazovat v těle struktury na strukturu téhož typu (na sebe). Proto musíme použít místo struktury ukazatel nebo referenci na strukturu.

  struct polozka
  {
    int hodnota;
    položka *p_dalsi;
  };

Datový typ union

Datový typ union je do jisté míry obdobný jako typ struktura. Union obsahuje více položek, ale při deklaraci je vyhrazena paměť pouze na velikost největší položky z položek definovaných v Union. To znamená, že v jeden okamžik lze používat pouze jednu položku z unionu. Položky jsou v datovém typu union definované "přes sebe". Typ union se využívá zejména pro úsporu místa v případě, kdy je potřeba využít vždy pouze jeden prvek, ale programátor předem nemůže určit který.

Syntaxe deklarace unie

  union [jmenovka]
  {
    Typ1 prvek1;
    Typ2 prvek2;
      ... 
  } [proměnná1, proměnná2, ...];

Argumenty deklarace unie

jmenovka
Nepovinná. Je-li uvedena jedná se o deklaraci unionu, jehož jméno bude jmenovka. Není-li jmenovka uvedena, musí být uvedena alespoň jedna proměnná tohoto typu.
Typ1 prvek1
Složky unionu - proměnné, funkce a prototypy.
proměnná
Nepovinné, definice proměnných, ukazatelů na ně atd. tohoto typu (vytvářeného typu union). Lze je definovat i později.

Příklad deklarace unie

  unie auto
  {
    char jmeno_vyrobce_kratsi[10];
    char jmeno_vyrobce_delsi[30];
  };

Poznámky - prvky unie

Prvkem unie nemůže být proměnná jejího vlastního typu. Toto omezení lze obejít použitím ukazatele nebo reference na proměnnou typu union.

Prvky unie nemohou být virtuální funkce, třídy s vlastními definicemi konstruktoru, destruktoru nebo přiřazovacího operátoru.

Unie nemohou mít předky ani potomky.

Příklad inicializace datového typu union

V příkladu deklarujeme unii auto se dvěmi prvky rozlišenými podle délky pole pro zadání jména výrobce. Pokud bude jméno výrobce kratší než 10 znaků použije se menší pole, v opačném případě se použije pole delší:

  unie auto
  {
    char jmeno_vyrobce_kratsi[10];
    char jmeno_vyrobce_delsi[30];
  };

  void main ()
  {
    char pomocna[30] = "";             
    cin >> pomocna;
    if (strlen (pomocna)<=10)
    {
      strcpy(auto.jmeno_vyrobce_kratsi,pomocna);
    }
    else
    {
      strcpy(auto.jmeno_vyrobce_delsi,pomocna);
    }
  }