ccpp:array

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.

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ů.

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ů

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

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]); 

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.

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)

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

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');
}
  • ccpp/array.txt
  • Poslední úprava: 2023/02/27 08:54
  • autor: bures