Datový typ pole
Pole představuje jeden ze strukturovaných datových typů - ukládá pod jedním identifikátorem více hodnot. Hodnoty jsou v poli uloženy v řadě za sebou a jsou očíslované od 0 pomocí tzv. indexu. Všechny honoty v rámci jednoho pole mají jeden stejný datový typ.
Jednorozměrné pole
Nejzákladnější verze pole je tzv. jednorozměré pole, které si můžeme představit jako jednořádkovou tabulku v následující ukázce:
+----+----+----+----+----+----+----+ | 13 | 41 | 5 | 17 | 8 | 6 | 14 | Hodnoty v poli +----+----+----+----+----+----+----+ 0 1 2 3 4 5 6 Indexy
Deklarace
Syntaxe deklarace pole vypadá následovně: datovy_typ identifikator[pocet_prvku];
, kde pocet_prvku musí být konstanta (být znám během překladu). Pole je po deklaraci neinicializované stejně jako v případě proměnných jednoduchých datových typů.
Příklad
int pole1[3]; // Pole tří celých čísel double pole2[5]; // Pole pěti čísel s plovoucí čárkou char pole3[10]; // Pole deseti znaků
Inicializace
Pole lze v rámci deklarace rovnou inicializovat seznamem hodnot. Pokud je zadáno méně hodnot, než je velikost pole, je zbytek doplněn nulami. Pokud je pole v rámci deklarace inicializováno, nemusí být uveden počet prvků - odvodí se z hodnot.
Příklad
int pole[4] = {1, 2, 3, 4}; // inicializace pole hodnotami 1, 2, 3, 4. char pole2[] = {'a', 'b', 'c', 'd', 'e', 'f'}; // inicializace bez uvedení počtu prvků short pole3[100] = {10, 20, 30}; // Prvni 3 položky maji dané hodnoty, zbytek je doplněn hodnotou 0
Práce s jednotlivými prvky pole
Pokud chceme z pole získat konkrétní hodnotu, musíme k tomu využít její index ve formátu identifikator[index]
. Prvky v poli můžeme číst i přepisovat (pokud není celé pole nastavené pouze pro čtení klíčovým slovem const
). Položky jsou indexované od 0.
Příklad
const int POCET = 3; int arr[POCET] = {1, 2, 3}; arr[0] = 42; arr[2] = 13; printf("Prvky pole jsou: %d, %d, %d.\n", arr[0], arr[1], arr[2]);
Vícerozměrná pole
Pole může mít i více rozměrů jak jeden. V případě dvou rozměrů si lze pole představit jako tabulku s buňkami (řádky, sloupce) u tří rozměrů jako krychli jejíž části se adresují pomocí souřadnic (např. X, Y, Z). Počet rozměrů není striktně omezen a může značně přesahovat naši fantazii.
Deklarace
Vícerozměrné pole deklarujeme uvedením více hranatých závorek za sebou: datovy_typ identifikator[rozmer1][rozmer2][rozmer3]…;
, kde rozměr#
představuje velikost pole v daném rozměru.
Příklady deklarací vícerozměrných polí
// tabulka obsahující 3 řádky a 5 sloupců int tabulka[3][5]; // krychle o velikosti 5 obsahující čísla s plovoucí čárkou cont int velikost = 5; float krychle[velikost][velikost][velikost] // pole o 5 rozměrech alokující pro každou sekundu z století jeden bajt s možností adresace na rok:den:hodinu:minutu:sekundu char stoleti[100][365][24][60][60];
Zkuste spočítat jak by bylo veliké pole stoleti
, za předpokladu, že velikost se s každým dalším rozměrem násobí. (počítáme tedy zprava doleva)
Incializace
Prvky pole můžeme opět v rámci deklarace rovnou inicializovat. Opět pomocí složených závorek, které se ale tentokrát do sebe zanořují podle rozměrů. Je třeba uvažovat nad celou věcí jako nad „polem polí“.
Příklad dvourozměrného pole
Matice identity (Identity matrix) o velikosti 3 uložená po řádcích.
float identity[3][3] = { {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f} }; ^ ^ | | První rozměr (řádky) - obsahuje 3 další pole | Druhý rozměr (3. sloupec) - obsahuje 3 položky typu float
Přístup k položkám vícerozměrného pole
Pro přístup ke konkrétním položkám opět využíváme indexů zapsaných v hranatých závorkách. Avšak musíme uvést index pro každý rozměr.
Příklad přístupu k položkám v rámci výpisu matice
const int ROWS = 3; const int COLS = 3; float identity[ROWS][COLS] = { {1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f} }; for (int row = 0; row < ROWS; ++row) { putchar('('); for (int col = 0; col < COLS; ++col) { printf("%f%s", identity[row][col], col < COLS - 1 ? ", " : ""); } putchar(')'); putchar('\n'); }