Pole je jednou ze základních a nejstarších datových struktur. Jedná se o souvislou lineární posloupnost homogenních prvků v paměti, jejichž pravidelné uspořádání zaručuje rychlý přístup ke každému z nich. Každý prvek je jednoznačně určen adresou prvního prvku pole a dalším přirozeným číslem (tzv. indexem) označujícím vzdálenost požadovaného prvku od začátku pole. Absolutní adresa prvku je pak vypočtena jako součet těchto dvou čísel.
Někdy se z důvodu větší přehlednosti či intuitivnosti používá k adresaci prvku indexů více (například N). Potom se mluví o poli N-rozměrném. Počet rozměrů pole odpovídá počtu indexů, kterými je popsáno umístění každého jednotlivého prvku v paměti. Vícerozměrná pole bývají v paměti uložena jako „pole polí“, nebo jako pole jednorozměrná, jejichž index je vypočítán ze všech indexů pomocí tzv. mapovací funkce (viz níže).
V jednorozměrných polích je každý prvek určen právě jedním indexem (souřadnicí). Jednorozměrná pole se nejčastěji používají pro ukládání vektorů (pole čísel) a řetězců (pole znaků).
pole se čtyřmi prvky
| Adresa paměťové buňky | Index hodnoty | Hodnota |
|---|---|---|
| proměnná POLE | ukazatel na 0×01A2 | |
| … | ||
| 0×01A2 | POLE+0 | 5 |
| 0×01A3 | POLE+1 | –24 |
| 0×01A4 | POLE+2 | 88 |
| 0×01A5 | POLE+3 | 3 |
| … | ||
Takto se s jednorozměrnými poli pracuje v jazyce Java:
kód v jazyce Java - Zobrazit
Pole v dnešních programovacích jazycích mají zpravidla pevně danou velikost (počet prvků x velikost prvku), ale některé interpretované jazyky jejich velikost dokáží měnit automaticky podle potřeby. Při nedostatečné kapacitě pole požádá program operační systém (či virtuální stroj) o větší volný prostor (který však nemusí být k dispozici!), do kterého překopíruje stávající data. Původní pole se následně uvolní. Větší pohodlí programátora je vykoupeno větší režií.
Matice a tabulky jsou příkladem polí dvojrozměrných. Každý prvek určují dvě souřadnice – index řádku a index sloupce. Trojrozměrné pole je zase podobné Rubikově kostce. Pole vyšších rozměrů si již představit neumíme, ale přesto se hojně v programech používají a jsou velmi užitečná.
ukázka jednotkové matice 3×3, uložené v „poli polí“
ukázka trojrozměrného „pole polí polí“
| Adresa paměťové buňky | Index hodnoty | Hodnota |
|---|---|---|
| proměnná POLE | ukazatel na 0×5A01 | |
| … | ||
| 0×5A01 | POLE+0 | ukazatel na 0×6122 |
| 0×5A02 | POLE+1 | ukazatel na 0×6132 |
| 0×5A03 | POLE+2 | ukazatel na 0×610A |
| … | ||
| 0×610A | POLE[2]+0 | 0 |
| 0×610B | POLE[2]+1 | 0 |
| 0×610C | POLE[2]+2 | 1 |
| … | ||
| 0×6122 | POLE[0]+0 | 1 |
| 0×6123 | POLE[0]+1 | 0 |
| 0×6124 | POLE[0]+2 | 0 |
| … | ||
| 0×6132 | POLE[1]+0 | 0 |
| 0×6133 | POLE[1]+1 | 1 |
| 0×6134 | POLE[1]+2 | 0 |
| … | ||
Použitím mapovací funkce lze ušetřit nějakou tu paměť za cenu dodatečných výpočtů při indexaci. Jak na to? Prvky vícerozměrného pole postupně (po řádcích či po sloupcích) uložíme do pole jednorozměrného. Požadovaný prvek pak nalezneme tak, že všechny indexy nejprve předložíme tzv. mapovací funkci, které je převede na jediný index v tomto jednorozměrném poli. K její sestavení však musíme znát maximální počet prvků v každém rozměru pole.
Mapovací funkce naleznou uplatnění i tam, kde s jiným než jednorozměrným polem pracovat nemůžeme (jednoduché procesory, staré programovací jazyky).
Takto vypadá mapovací funkce, která mapuje dvojrozměrné pole o velikosti M x N do pole jednorozměrného (M je počet prvků v jednom řádku):
€€ f(x,y) = x + M \cdot y €€Zobecněním mapovací funkce z předchozího výkladu získáme návod na sestavování mapovacích funkcí i pro pole vyšších rozměrů (Ni je maximální počet prvků v rozměru i).
€€ f(x_1,...,x_n) = x_1 + \sum_{i=2}^{n} N_i \cdot x_i €€Pro převod indexů bude použita tato mapovací funkce (viz níže):
€€ i = x + 3 \cdot y €€| Adresa paměťové buňky | Index hodnoty | Hodnota |
|---|---|---|
| proměnná POLE | ukazatel na 0×5A01 | |
| … | ||
| 0×5A01 | POLE+0 | 1 |
| 0×5A02 | POLE+1 | 0 |
| 0×5A03 | POLE+2 | 0 |
| 0×5A04 | POLE+3 | 0 |
| 0×5A05 | POLE+4 | 1 |
| 0×5A06 | POLE+5 | 0 |
| 0×5A07 | POLE+6 | 0 |
| 0×5A08 | POLE+7 | 0 |
| 0×5A09 | POLE+8 | 1 |
| … | ||
Takto se v Jave pracuje s dvojrozměrným polem:
kód v jazyce Java - Zobrazit