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.
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
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ů.
int pole1[3]; // Pole tří celých čísel double pole2[5]; // Pole pěti čísel s plovoucí čárkou char pole3[10]; // Pole deseti znaků
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.
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
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.
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]);
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.
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.
// 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)
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í“.
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
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.
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'); }