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:
|
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:
|
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ů.
|
Pole a a b z výše uvedených definic pak budou vypadat takto:
pole a | pole b | ||||||||||||
|
|
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.
|
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.
|
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):
- Učíme se C (1. díl)
- Učíme se C (2. díl)
- Učíme se C (3.díl)
- Učíme se C (4. díl)
- Učíme se C (5.díl)
- Učíme se C (6.díl)
- Učíme se C (7.díl)
- Učíme se C (8.díl)
- Učíme se C (9.díl) - Řetězce
- Učíme se C (10.díl) - Vstupně výstupní funkce
- Učíme se C (11.díl) - Formátovaný výstup
- Učíme se C (12.díl) - Formátový specifikátor
- Učíme se C (13.díl)
- Učíme se C (14.díl) - Vícerozměrná pole
- Učíme se C (15.díl) - Ukazatele
- Učíme se C (16.díl) - Modifikátory paměťové třídy
- Učíme se C (17.díl) - Pole a ukazatel
- Učíme se C (18. díl) - Dynamická alokace paměti
- Učíme se C (19. díl) - Práce se soubory I.
- Učíme se C (20. díl) - Práce se soubory II.
- Učíme se C (21. díl) - Parametry funkce main()
- Učíme se C (22. díl) - Ukazatele na funkce
- Učíme se C (23. díl) - Složité deklarace a definice
- Učíme se C (24. díl) - Funkce s proměnným počtem parametrů
- Učíme se C (25. díl) - Bitové operátory a bitové pole
- Učíme se C (26. díl) - Datové typy enum a union
- Učíme se C (27. díl - závěr) - Programové moduly
Diskuse k článku
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007