wtorek, 8 marca 2016

C - Typy złożone - typedef, enum, union

Język C zawiera kilka rodzajów typów złożonych, które postaram się opisać w tym poście.

Typedef


Podane słowo kluczowe w nagłówku służy do definiowania typów pochodnych, Pozwala ono na skrócenie deklaracji zmiennej, zamiast używać długiej nazwy pełnej definicji można wykorzystać krótszą przy użyciu typedef. Czyli w skrócie zostanie zmieniona nazwa deklaracji wypisanego typu. Dodatkowo ta definicja może być widoczna tylko w lokalnym programie.


    typedef char ch;
    ch w;
    typedef int i;
    i c;

Jest on często stosowany ze strukturą pozwala to na zmniejszenie konieczności dodatkowego dodawania kolejnych deklaracji.

Enum


Jest to tzw typ wyliczeniowy. Pozwala on na stworzenie zmiennych, które będą przechowywać tylko ustalone w nim wartości.

enum Nazwa{wartosc1, wartosc2, wartosc3, ...., wartoscn}

Wpisane wartości są przechowywane jako liczby całkowite. Domyślnie jeśli nie przypisana zostanie jej inna wartość całkowita zdefiniowanym nazwą to liczenie idzie od 0. Jeśli którejś definicji w ciągu zostanie przypisana liczba spoza kolejności to następna będzie liczba kolejna po wprowadzonej.

Jeśli są one wprowadzana na sztywno to ich kolejność oraz wielkość nie ma znaczenia.

Struktura


Jest to dosyć specyficzny typ danych. Może on przechowywać wiele wartości zapisanych w jednej zmiennej. Posiada ona tą zaletę nad tablicą, że dane w niej przechowywane nie muszą być tego samego typu.

struct Nazwa
{
   int liczba;
   char znak;
   float liczba2;
};

Aby się odwołać do konkretnej zmiennej należy wykorzystać następujące wywołanie:

nazwa.liczba2 = 74.23;

Unia


Jest to jeden ze sposób pozwalających na prezentację danych w pamięci. Wyglądowo przypomina on strukturę, definiuje się ją w następujący sposób:

union Nazwa
{
   int liczba;
   float liczba2;
   char znak;
};

Dostęp do danych jest inny niż w przypadku struktury. W każdym momencie można uzyskać dostęp do jednego z zdeklarowanych typów. Rozmiar pamięci jaki może ona zajmować jest taki jaka jej największy wprowadzony typ. Pozwala to na zmniejszenie zapotrzebowania na pamięć, pozostałe typy będą nie wykorzystywane. Oznacza to, że kolejny zapis do innej zmiennej spowoduje zamazanie poprzednich zapisów. 

Program


Poniżej przedstawiam program na którym można zobaczyć działanie unii.

Najpierw sprawdzana jest jej wielkość, w kolejnych krokach przypisane są liczby najpierw do jednej a potem do drugiej zmiennej. W pierwszym przypadku, przy zapisie to liczba1. W drugim przypadku wprowadzane są dane do liczba2, po czym są one znowu wyświetlone.

#include <stdio.h>
#include <stdint.h>
 
union Unia1
{
    float liczba1;
    double liczba2;
}Liczby;
 
int main ()
{
    printf("\n%d\n", sizeof(Liczby));
 
    Liczby.liczba1 = 3.14;
    printf("\n Liczby F: %f\n", Liczby.liczba1);
    printf("\n Liczby LD: %lf\n", Liczby.liczba2);
 
    Liczby.liczba2 = 3.14;
    printf("\n Liczby F: %f\n", Liczby.liczba1);
    printf("\n Liczby LD: %lf\n", Liczby.liczba2);
 
    return 0;
}