Týden 6
Základní (primitivní) datové typy III
Reálné datové typy jsou vždy se znaménkem a jazyk C nabízí tyto:
- float - reálný typ s poloviční přesností
- double - reálný typ s plnou přesností
- long double - reálný typ se zvýšenou přesností, nemusí být podporován, často je to double
a platí pro ně sizeof(float) <= sizeof(double) <= sizeof(long double). Typy float a double jsou často implementovány podle standardu IEEE 754 - nyní už ISO (http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57469). Typ float je nejčastěji veliký 32 bitů a typ double 64 bitů. Typ long double bývá implementován jako double. Konkrétní vlastnosti reálných typů popisují makra ze souboru float.h - http://www.cplusplus.com/reference/clibrary/cfloat/, např.:
- FLT_DIG - počet číslic, které lze reprezentovat typem float bez zaookrouhlení
- FLT_MIN
- FLT_MAX
Výčtový typ enum
Výčtový typ je vhodný k definici celočíselných konstant. Často konstanty reprezentují námi vytvořený konečný obor hodnot, kterých pak může proměnná nabývat.
Jako příklad mějme semafor - barvy (hodnoty) mohou být červená, oranžová, zelená:
enum semaphore { RED, // 0 ORANGE, // 1 GREEN // 2 }; // definice promenne semaphore sem = RED;
Konstanty jsou reprezentovány celočíselným typem (např. int) - jazyk C neurčuje kterým. Přesný typ je závislý na prostředí (stroj, kompilátor). Konstantám jsou přiřazovány celočíselné hodnoty od nuly po jedné v pořadí v jakém jdou za sebou, pokud není určeno jinak. Hodnoty konstant lze nastavit pomocí operátoru přiřazení (=):
enum little_number { ONE = 1, TWO, // 2 THREE, // 3 FIVE = 5 };
Konstanty výčtových typů je možné přímo přiřazovat do proměnných typu int a naopak hodnoty z proměnných typu int považovat za konstanty výčtových typů.
Ukazatele (pointry)
Pointry ukazují na místo v paměti počítače. Mohou ukazovat na jednoduchou proměnnou nebo na složitější objekt, např. pole. Jazyk C je nízkoúrovňový, a proto jsou v něm pointry zapotřebí k vytváření složitějších (dynamických) datových struktur, předávání měnitelných argumentů funkcím (scanf) nebo jinému způsobu procházení polem. Definice pointru se zapíše tak, že zvolíme typ ukazatele, zapíšeme operátor dereference * - označuje, že jde o pointer - a zapíšeme identifikátor; např. takto:
// definice pointru - bez nastaveni hodnoty (adresy v pameti) int * p; // definice pointru - nastaveni na adresu promenne nebo pole int x = 5; int nums[5]; int * px = &x; // pnums bude ukazovat na prvni prvek pole int * pnums = nums;
Pomocí pointru můžeme měnit hodnotu na adrese v paměti, kam pointer ukazuje:
int x = 5; int * px = &x; // v x se zmeni hodnota na 3! *px = 3;
Složené (agregované) datové typy I - pole
Základní datové typy je možné použít k vytváření složených datových struktur - ty mohou být buď homogenní (všechny prvky mají stejný typ) nebo nehomogenní. Pole v jazyce C je homogenním složeným typem, tj. nelze vytvářet pole, která by měla prvky různých typů. K definici (vytvoření) pole se užívají hranaté závorky [ a ] - pole typu int o velikosti 10 prvků se zapíše např. takto:
// vytvori pole celych cisel o velikosti 10 prvku int numbers[10]; // vytvori pole z konstant podle jejich poctu int smallPrimes[] = { 2, 3, 5, 7 };
Pole v jazyce C má v paměti uloženy všechny prvky za sebou (jeden za druhým) a k jednotlivým prvkům se přistupuje pomocí indexů od nuly:
// nastav prvni prvek pole na 5 a druhy na 7 numbers[0] = 5; numbers[1] = 7; // nastav posledni prvek pole na 0 numbers[9] = 0;
Samotný identifikátor pole numbers označuje adresu v paměti počítače, kde pole začíná. Adresu libovolného prvku je možné získat operátorem reference & tak, že jej umístíme před označení prvku pole:
// adresa pateho! prvku pole int * address = &numbers[4];
Kromě indexů můžeme pole procházet také pomocí pointrů - využívat pointrovou aritmetiku:
int numbers[] = { 1, 2, 3, 4, -1 }; // definice pointru znak na zacatek pole int * pnum = numbers; // cyklus spocita vsechna suda cisla a skonci zapornym cislem int count = 0; while (*pnum >= 0) { count++; }