Učíme se C (14.díl) - Vícerozměrná pole - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

Učíme se C (14.díl) - Vícerozměrná pole

29. prosince 2000, 00.00 | Vícerozměrná pole v jazyce C, jejich definice a použití.

Vícerozměrná pole

V jednom z minulých dílů tohoto seriálu jsme si již představili typ pole. Dnes se k tomuto tématu znovu vrátíme. Tentokrát ale bude řeč o polích vícerozměrných.

Definice vícerozměrného pole

Vícerozměrná pole se definují podobně jako jednorozměrná. Stačí pouze připojit další dvojici hranatých závorek, která poli přidá novou dimenzi.

definice jednorozměrného pole o deseti prvcích:
int a[10];

definice dvourozměrného pole 10x5:
int b[10][5];

Zápis definice proměnné a přečteme obvyklým způsobem: “a je pole desíti prvků, jejichž typ je int.” Čtení druhé definice bude o trochu složitější. Jak už bylo řečeno, lze se na vícerozměrná pole dívat jako na pole prvků, kde tyto prvky jsou jiná pole. Zápis druhé definice tedy přečteme takto: “b je pole desíti prvků, jejichž typ je pole pěti prvků typu int.” Tento způsob chápání považuji za srozumitelnější, než je představa pomocí řádků a sloupců matice, která navíc není dobře použitelná pro pole vyšších řádů. Představa, jak jsme si ji nastínili, navíc podává i obraz toho, jak je vícerozměrné pole uloženo v paměti a dobře poslouží i při inicializaci vícerozměrného pole.

přístup k prvkům pole

Stejně jako při definici, i při indexaci pole stačí přidat další index (ve vlastních hranatých závorkách). Vraťme se znovu k následující definici:

int b[10][5];

Opět využijeme způsobu nazírání jako na jednorozměrné pole. Použitím jednoho indexu získáme některý prvek pole b. Například zápisem b[6] získáme sedmý prvkek pole b. Tento prvek je ale sám pětiprvkové pole. Další indexací se tedy pohybujeme mezi prvky tohoto pole. Například b[6][3]

Ukážeme si to na příkladu, ve kterém si vytvoříme pole reprezentující následující matici:

1 2 3
4 5 6
7 8 9
10 11 12

Nejprve vytvoříme nové neinicializované pole 4x3:

int b[4][3];

Pomocí prvního indexu tedy budeme vybírat řádek a druhým se budeme pohybovat po prvcích tohoto řádku. Teď můžeme pole naplnit příslušnými hodnotami:

int i,j, k=1;
for (i=0; i<4; i++)
  for (j=0; j<3; j++, k++) b[i][j]=k;

Myslím, že funkci programu není třeba dlouze komentovat. Snad jen skutečnost, že v posledním řádku jsme využili vlastností operátoru „čárka“ pro iteraci proměnné k. Pro úplnost ještě připojuji tabulku, ze které bude jasné, jaké indexy odpovídají určitému prvku matice.

1 - (b[0][0]) 2 - (b[0][1]) 3 - (b[0][2])
4 - (b[1][0]) 5 - (b[1][1]) 6 - (b[1][2])
7 - (b[2][0]) 8 - (b[2][1]) 9 - (b[2][2])
10 - (b[3][0]) 11 - (b[3][1]) 12 - (b[3][2])

inicializace při definici

I vícerozměrná pole se dají inicializovat již při definici, a to stejně jako pole jednorozměrná. Opět si ale musíme uvědomit, že jednotlivými prvky pole jsou jiná pole, a tak jako inicializátory musíme uvádět další seznamy inicializačních výrazů.

int a[2][3]={{22,1,16},{112,0,4}};
int b[3][2]={{22,1},{16,112},{0,4};

Pole a a b z výše uvedených definic pak budou vypadat takto:

pole a pole b
22 1 16
112 0 4
22 1
16 112
0 4

U jednorozměrných polí jsme nemuseli specifikovat hodnotu velikosti pole v případě, že jsme ho rovnou inicializovali. V případě vícerozměrných polí je možné vynechat pouze údaj o počtu prvků nejvíce vnějšího pole, tedy toho, které již není prvkem jiného pole. V zápise definice to je vždy první dvojice závorek vpravo od identifikátoru pole. Ostatní závorky musí být vyplněny.

int b[][2]={{22,1},{16,112},{0,4}};

// překladač si sám doplní správnou
// hodnotu (v našem případě 3) za
// nespecifikovanou velikost pole.

Uložení vícerozměrného pole v paměti

V některém z dalších dílů seriálu se dozvíme, jak přistupovat k polím jako k bloku paměti. Pak se nám může hodit vědět, jak jsou pole v paměti uložena. V případě jednorozměrných polí je to celkem jasné. Jednotlivé prvky jsou postupně od nultého indexu uloženy jeden za druhým. Uvědomíme-li si znovu, že vícerozměrné pole není nic jiného než jednorozměrné, které jako své prvky obsahuje další pole, snadno přijdeme na to, jak jsou prvky v paměti uloženy. Vezměme si následující definici:

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

Zápis přečteme jako: “a je pole dvou prvků typu: pole tří prvků typu int.” Zaměříme se na první část věty říkající, že a je pole dvou prvků. Tyto dva prvky tedy musí být v paměti uloženy hned za sebou. Obsahem každého z těchto dvou prvků je ale jiné pole tří prvků. Blok paměti, kde je pole a uloženo, pak bude vypadat takto:

Využijeme-li vlastnosti jazyka C, že nekontroluje meze polí a znalost toho, jak jsou data v paměti ukládána, můžeme přepsat příklad z podkapitoly o indexaci vícerozměrného pole do trochu jednodušší formy. Tento způsob ovšem nelze obecně doporučit.

int b[4][3];
int i;
for (i=0; i<12; i++) b[0][i]=i+1;

Tří a vícerozměrná pole

Doposud jsme si vše ukazovali pouze na příkladech dvourozměrných polí, je ale jasné, že vše bude analogicky platit i pro více než dvourozměrná pole. To snad ukáží i následující příklady.

definice trojrozměrného pole 3x4x2:
int a[3][4][2];

definice trojrozměrného pole 2x2x2 s inicializací:
int a[2][2][2]={{{1,5},{6,0}},{{3,5},{2,2}}};

definice trojrozměrného pole 2x2x2 s inicializací a bez udání velikosti první dimenze pole:
int a[][2][2]={{{1,5},{6,0}},{{3,5},{2,2}}};

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: