Statická vícerozměrná pole

Doplňující informace

Deklarace vícerozměrného pole

Bez inicializace (obecně):

typ identifikátor[velikost_1]...[velikost_N];

kde typ je datový typ prvků pole, identifikátor je identifikátor proměnné typu pole a velikost_1velikost_N jsou velikosti pole v jednotlivých rozměrech.

Příklady:

int moje_matice[3][4];
float trojrozmerne[3][4][10];

S inicializací:

typ id[vel_1]...[vel_N] = { hodnoty_v_blocích };

kde za rovnítkem nasledují inicializační hodnoty uspořádané v blocích, jejíž velikosti odpovídají velikostem jednotlivých rozměrů pole od posledního k prvnímu (viz příklad níže).

Příklady:

int matice[2][3] = {{1, 2, 3}, {4, 5, 6}};

int m[2][3][4] = {{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}},
                  {{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}};

Přístup k prvkům pole

K prvkům vícerozměrného pole přisputujeme pomocí několikanásobného užití operátoru indexu [].

Příklad:

int i, j;
int a[3][4];

for (i = 0; i < 3; i++)
   for (j = 0; j < 4; j++)
      a[i][j] = 1 + j + i * 4;

for (i = 0; i < 3; i++){
   for (j = 0; j < 4; j++)
      printf("%i\t", a[i][j]);
   printf("\n");
}

Uložení prvků pole v paměti

Prvky pole jsou v paměti ukládany ve stejném pořadí, v jakém se uvádějí při inicializaci pole. Například u pole int x[2][3] jsou v paměti uloženy v pořadí: x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2]. Na n-rozměrné pole se lze také dívat jako na jednorozměrné pole, jehož prvky jsou (n-1)-rozměrná pole. Výše uvedené dvourozměrné pole x tedy může být chápáno jako jednorozměrné pole typu int [3] o velikosti 2.

Vztah polí a ukazatelů

Podobně jako u polí jednorozměrných, i zde existuje vztah mezi poli a ukazateli. V našem příkladu je x adresa dvourozměrného pole (proměnná typu int[2][3] nebo téměř ekvivalentně int (*)[3]), x[0] je adresa prvního řádku a x[1] je adresa druhého řádku (oba typ int [3] nebo int *).

Vícerozměrné pole jako parametr funkce

Také vícerozměrné pole může být parametrem funkce. V tomto případě definujeme (podobně jako u polí jednorozměrných) formální parametr bez udání prvního rozměru, všechny následující rozměry musí být uvedeny. Ekvivalentně můžeme formální parametr dané funkce definovat jako ukazatel odpovídajícího typu.

Příklady:

int maxim(int cisla[][3], int radku) {...}
...
int cisla[2][3] = {{1, 45, 21}, {5, 7, 2}};
max = maxim(cisla, 2);
int maxim(int (*cisla)[3], int radku){...}
...
int cisla[2][3] = {{1, 45, 21}, {5, 7, 2}};
max = maxim(cisla, 2);

Creative Commons License Sbírka úloh z jazyka C. © Katedra informatiky Univerzity Palackého v Olomouci, 2009.
Projekt byl vytvořen za podpory grantu FRVŠ 2061/2009/G1.