Seminární skupina IB001 Úvod do programování skrze C (skupiny 27 a 28)

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++;
}