11. Vícenásobná pole

V C# jsou vícedimenzionální pole označována jako pravoúhlá pole (anglicky "Rectangular Array"), kde každá dimenze má pravidelný tvar. Často však nepotřebujeme vyplnit všechny prvky takových polí a tím pádem jen zbytečně plýtváme pamětí na prázdné prvky. Proto je vhodné využít tzv. vícenásobné pole (anglicky "Jagged Array"). Vícenásobné pole je takové pole, jehož prvky obsahují další pole - někdy také označované "pole polí", nebo "zubatá matice". Prvky vícenásobného pole mohou mít různé velikosti. 

V následujícím zdrojovém kódu vidíme deklaraci vícenásobného pole včetně vytvoření instance vicenasobnePole - viz Kód 1. 

//Deklarace tří řádků vícenásobného pole (sloupce jsou prázdné)
int[][] vicenasobnePole = new int[3][];

Kód 1: Deklarace vícenásobného pole vicenasobnePole

Vícenásobné pole lze vnímat jako pole, které bude obsahovat tři prvky do kterých postupně umístíme další jednorozměrná celočíselná pole. Proto nejprve vytvoříme další tři instance jednorozměrných celočíselných polí o různé délce pojmenované pole0, pole1, pole2 - viz Kód 2.

//Deklarace jednorozměrných polí s různou délkou
int[] pole0 = new int[5];
int[] pole1 = new int[3];
int[] pole2 = new int[4];

Kód 2: Deklarace jednorozměrných polí

Podstata předchozích kódů je zobrazena na následujícím obrázku - viz Obrázek 1.

Deklarace vícenásobného pole a tří jednorozměrných polí

Obrázek 1: Deklarace vícenásobného pole a tří jednorozměrných polí 

Po vytvoření jednorozměrných polí provedeme jejich přiřazení (tzn. vytvoření odkazů) prvkům vícenásobného pole - viz Kód 3.

//Přiřazení jednotlivých polí řádkům vícenásobného pole
vicenasobnePole[0] = pole0;
vicenasobnePole[1] = pole1;
vicenasobnePole[2] = pole2;

Kód 3: Přiřazení polí do jednotlivých řádků (prvků) vícenásobného pole

Celá podstata přiřazení jednotlivým prvkům vícenásobného pole je zobrazena na následujícím obrázku - viz Obrázek 2.


Obrázek 2: Přiřazení jednorozměrných celočíselných polí prvkům vícenásobného pole

Uvědomme si, že přiřazení jednorozměrných polí o různé délce prvkům vícenásobného pole je pomocí referencí a nikoliv pomocí kopírování dat do těchto prvků. Pokud tedy změníme např. třetí prvek jednorozměrného pole pole0 (tedy pole0[2]), měníme tím také prvek vicenasobnePole[0] ve vícenásobném poli obsahující toto jednorozměrné pole, (tedy  vicenasobnePole[0] [2]). Následující zápis ve zdrojovém kódu na obou řádcích provádí přiřazení hodnoty třetího prvku pole0 - viz Kód 4.

//Přiřazení hodnoty třetímu prvku jednorozměrného 'pole0'
pole0[2] = 38;
/* Přiřazení hodnoty třetímu prvku jednorozměrného 'pole0' uloženého 
 * v prvním prvku vícenásobného pole */
vicenasobnePole[0][2] = 38;

Kód 4: Příkazy se stejnou podstatou - přiřazení hodnoty třetímu prvku jednorozměrného pole0