V jazyku C je možné definovat si vlastní datové typy. K tomuto účelu používáme konstukci typedef. Syntaxe (obecně):
typedef zápis_ve_tvaru_deklarace;
Příklady definice typu:
typedef int cele_cislo; /* přejmenování typu; nepoužívá se */ typedef int male_pole[10]; /* vytvoření typu pro pole 10 prvků typu int */ typedef unsigned long ULong; /* přejmenování typu za účelem zkrácení zápisu; používá se zřídka */ typedef const ULong CULong; /* v definici typu je možné využít všechny dříve definované typy */
DeklaraceDefinice proměnné odvozeného typu:
male_pole moje_cisla; ULong velke_cislo;
Výčtový datový typ se používá se pro definici většího počtu spolu souvisejících celočíselných konstant. K vytváření výčtových typů používáme konstrukci enum. Syntaxe:
enum identifikátor_typu{ id_clenu_1 = konst_výraz_1, ... id_clenu_N = konst_výraz_N } id_prom_1 = hodnota_1, ... , id_prom_M = hodnota_M;
kde identifikátor_typu je identifikátor nově vytvářeného výčtového typu, id_clenu_1 až id_clenu_N jsou identifikátory vytvářených konstant, konst_výraz_1 až konst_výraz_N hodnoty vytvářených konstant.
Pokud není hodnota konstanty v definici typu specifikována, je nastavena na hodnotu předchozí konstatny zvětšenou o 1 (na hodnotu 0 v případě první konstanty v definici).
Součástí definice výčtového typu může být také deklarace libovolného množství proměnných tohoto typu id_prom_1 až id_prom_M a jejich případná inicializace hodnotami hodnota_1 až hodnota_M.
Příklady definice výčtového typu:
enum Bool{TRUE = 1, FALSE = 0 }; /* pouze definice typu */ enum Bool{TRUE = 1, FALSE = 0 } splnen=TRUE; /* definice typu s definicí a inicializací proměnné */ enum {FALSE, TRUE} splnen = 1; /* definice bezejmenného typu s využitím implicitních hodnot konstant */ enum Den{Po,Ut,St,Ct,Pa,So=10,Ne} muj_den; /* kombinace implicitních a explicitně zadaných hodnot */
Příklady deklaracedefinice proměnných výčtového typu:
enum Bool splneno; /* definice bez inicializace */ enum Bool splneno = 0; /* inicializace číselnou hodnotou */ enum Den muj_den = Po; /* inicializace identifikátorem konstanty */
Příklady použití výčtového typu:
splneno = TRUE; /* využití symbolického jména */ muj_den = 3; /* využití číselné hodnoty */ cislo = muj_den * So + splneno; /* s konstantami lze provádět jakékoli operace */
Jedná se o nejpřehlednější a v praxi nejpoužívanější způsob definice výčtových typů. Typ se nepojmenovává v konstrukci enum, ale až v konstrukci typedef. viz namespace Příklady definice typu:
typedef enum{TRUE = 1, FALSE = 0} Bool; typedef enum{Po,Ut,St,Ct,Pa,So=10,Ne} Den;
Příklady deklarace proměnných výčtového typu:
Bool splneno; Bool splneno = 0; Den muj_den = Po;
Strukturovaný datový typ se používá se pro uložení více spolu souvisejících prvků, které mohou být různého typu (na rozdíl od pole). K vytváření struktur používáme konstrukci struct. Syntaxe:
struct identifikátor_typu{ typ_clenu_1 id_clenu_1; ... typ_clenu_N id_clenu_N; } id_prom_1 = {inic_1}, ..., id_prom_M = {inic_M};
kde
Člen struktury může být libovolného typu, pouze ne stejného typu jako právě definovaná struktura (lze obejít užitím ukazatelů).
Součástí definice strukturovaného typu může být také
deklaracedefinice libovolného množství proměnných tohoto typu id_prom_1 až id_prom_M
a jejich případná inicializace výrazy inic_1 až inic_M (podobně jako inicializace polí).
Příklady definic strukturovaného typu:
struct Datum{char Den, Mesic; short Rok;}; /* pouze definice typu, h0nza: ne! struct tag! */ struct Datum{char Den, Mesic; short Rok;} narozen = {24, 3, 1972}; /* definice typu i proměnné s inicializací */ struct {char Den, Mesic; short Rok;} narozen = {24, 3, 1972}; /* definice typu beze jména */
Příklady deklarací proměnných strukturovaného typu:
struct Datum narozen; /* definice bez inicializace */ struct Datum narozen = {24, 3, 1972}; /* definice s inicializací */
Jedná se o nejpřehlednější a v praxi nejpoužívanější způsob definice struktur. Typ se nepojmenovává v konstrukci struct, ale až v konstrukci typedef. Příklad definice typu:
typedef struct { char Den, Mesic; short Rok; } Datum;
Příklady deklaracedefinice proměnných strukturovaného typu:
Datum narozen; Datum narozen = {24, 3, 1972};
K jednotlivým členům struktury přistupujeme pomocí operátoru tečka, před kterým je uveden identifikátor proměnné strukturovaného typu a za ním identifikátor členu struktury, ke kterému přistupujeme. Příklady:
Datum muj_den, narozen, dnes; int vek; muj_den.Den = 24; muj_den.Mesic = (muj_den.Mesic + 3) % 12; vek = dnes.Rok - narozen.Rok;