Týden 7
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 };
Takto vytvořené pole 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 takto:
// 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 long address = &numbers[4];
Řetězce I
Řetězec je v jazyce C reprezentován jako pole znaků - typu char, které obsahuje hodnotu 0 - konstanta '\0'. Nulová hodnota v poli znaků říká, kde řetězec končí. Všechny funkce pracující s řetězci na tuto nulovou hodnotu spoléhají, pokud ji v řetězci zapomeneme, bude program pracovat chybně. V jazyce C je možné definovat řetězcovou konstantu - řetězec, který vytvoří kompilátor - takto:
char string[] = "Hello, World!";
Základní funkce pro práci s řetězci naleznete v hlavičkovém souboru string.h - http://www.cplusplus.com/reference/clibrary/cstring/.
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:
// nedefinovany pointer int * p; // definice pointru - nastaveni na adresu promenne nebo pole int x = 5; int nums[5]; p = &x; p = 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;
Můžeme také procházet polem (řetězcem) - využívat pointrovou aritmetiku:
char pozdrav[] = "Ahoj"; // definice pointru znak na zacatek retezce pozdrav char * znak = pozdrav; // cyklus pripocte kazdy znak retezce az skonci znakem '\0', ktery v C ukoncuje retezec int delka = 0; while (*znak != '\0') { delka++; znak++; }