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 (8.díl)
30. října 2000, 00.00 | První z článků věnujících se datovému typu pole. Řeč bude o definici
polí v C, jejich indexaci a na co si dát pozor při práci s nimi.
Pole
Dnes se podíváme, jakým způsobem se v jazyce C pracuje s typem pole. Pole je strukturovaný datový typ, což znamená, že má svou vlastní vnitřní strukturu, která je tvořena položkami určitého datového typu. K těm lze pak přistupovat odděleně.
Definice proměnné typu pole
Proměnná typu pole se definuje podobně jako proměnná jednoduchého typu. Rozdílem je, že při definici pole se za jménem identifikátoru proměnné ještě uvádějí hranaté závorky, ve kterých určíme počet prvků pole.
bázový_typ identifikátor[počet_prvků];Bázový typ neurčuje typ proměnné, ale typ položek pole. Že jde o pole pozná překladač právě podle hranatých závorek. Počet_prvků je jakýkoliv konstantní výraz, tedy takový, který lze vyhodnotit již při překladu. Podívejme se na konkrétní příklad definice pole:
short int moje_pole[10];Nadefinovali jsme proměnnou typu pole, která obsahuje 10 položek typu short int. Znamená to tedy, že se pro naši proměnnou vyhradilo 20 bytů (10 * sizeof(short int)). Tato paměť tvoří jeden souvislý blok, což se ukáže být důležité až přijde řeč na pointery. V případě, že je takto nadefinovaná proměnná statická (existuje po celou dobu vykonávání programu), jsou všechny položky pole inicializovány nulovou hodnotou. Naopak, v případě že jde o lokální automatickou proměnnou (vzniká až při běhu programu a existuje pouze omezenou dobu), nejsou jednotlivé prvky pole inicializovány.
Prvky pole ale lze inicializovat již při definici. Stačí za poslední hranatou závorku uvést znak ‘=’ následovaný seznamem inicializačních výrazů, jak ukazuje následující příklad:
short int moje_pole[5]={1, 0, 443, -46, 987};Inicializační výrazy se přiřazují postupně, tak jak jsou zapsány. Pole moje_pole bude naplněno hodnotami takto:
V případě, že počet inicializačních výrazů je vyšší než počet položek pole, bude se při překladu hlásit chyba. Pokud je počet inicializátorů menší, chyba se nehlásí a zbylé položky jsou inicializovány buď nulovou hodnotou, nebo nejsou inicializovány vůbec.
Pokud při definici zároveň inicializujeme prvky pole, nemusíme specifikovat velikost pole, ale stačí když uvedeme prázdné závorky. Překladač sám určí velikost pole podle počtu inicializačních výrazů.
short int moje_pole[]={1, 0, 443, -46, 987};Přístup k prvkům pole
Máme-li nadefinovanou proměnnou typu pole, jistě budeme chtít přistupovat k jednotlivým položkám. To se provádí obdobně jako v jiných jazycích pomocí indexace. V jazyce C jsou všechny proměnné typu pole indexovány od nuly. To znamená, že první položka má vždy index 0, což není možné nijak ovlivnit. Budeme-li tedy chtít získat první položku pole, použijeme zápis:
moje_pole[0]Je důležité si uvědomit, že indexací nezískáváme pouze hodnotu prvku pole, ale přímo prvek samotný, tedy l-hodnotu. Je tedy možné použít tento zápis i na levé straně přiřazovacího výrazu:
int moje_pole[4]; moje_pole[0]=250;Tímto zápisem jsme do první položky pole zapsali hodnotu 250.
S poli můžou pracovat i operátory ==, != a další, nicméně význam použití těchto operátorů je, v souvislosti s poli, poněkud jiný, než byste možná čekali. Vezměme si tento příklad:
int moje_pole[4]={15, 35, 66, 1000}; int dalsi_pole[4]={15, 35, 66, 1000}; if (moje_pole == další_pole) {...}I když by se mohlo zdát, že se porovnají jednotlivé prvky pole, není tomu tak. Ve skutečnosti se provede pouze porovnání ukazatelů na první prvek pole. Tyto ukazatele ale mohou být stejné pouze v případě, že půjde o identická pole a tedy blok v příkazu if v našem příkladu se neprovede nikdy, bez ohledu na položky pole.
procházení pole
Při procházení položek pole je nutné dát si pozor na to, abychom nikdy omylem nepřekročili hranice pole. Jazyk C totiž zásadně nekontroluje meze polí, a tak je bez problémů možné číst i zapisovat do paměti, která nám již nepatří. To v nejhorším případě může vést až ke zhroucení programu, nebo celého počítače. Předně si musíme uvědomit, že indexace polí začíná nulou. Poslední prvek pole o n položkách tedy bude mít index n-1. V následujícím příkladu si ukážeme procházení pole spojené s inicializací jeho položek:
#define VELIKOST_POLE 20 int moje_pole[VELIKOST_POLE], i; . . . for (i=0; i<VELIKOST_POLE; i++) moje_pole[i]=0;
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
-
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