Typ pole (1) Proměnná typu pole představuje kolekci proměnných stejného datového typu, které mohou být označovány společným jménem (identifikátorem) Pole je homogenní datový typ Jedna proměnná v poli se nazývá prvek (po-ložka, složka) pole Každý prvek je explicitně označitelný a pří-mo přístupný 18/07/2018
Typ pole (2) Zpřístupnění jednoho prvku se provádí jmé-nem proměnné (typu pole) a indexem (inde-xy) určujícím konkrétní prvek v poli V jazyce C pole obsazuje spojitou oblast ope-rační paměti tak, že: první prvek je uložen na nejnižší přidělené adrese každý další prvek je uložen na adrese vyšší poslední prvek je uložen na nejvyšší adrese Pole mohou být: jednorozměrná vícerozměrná (dvourozměrné pole – matice) 18/07/2018
Jednorozměrné pole (1) Definice proměnné typu pole: datový_typ idPole[velikost]; datový_typ: specifikuje datový typ jednotlivých prvků pole idPole: identifikátor proměnné typu pole velikost: určuje počet prvků v poli jednotlivé prvky jsou zpřístupnitelné pomocí indexů v rozmezí 0 až velikost–1 poznámka: indexy prvků pole začínají vždy od nuly 18/07/2018
Jednorozměrné pole (2) Příklad: int hodnoty[10]; definuje proměnnou hodnoty (typu pole) obsahující 10 prvků typu int, které jsou zpřístupnitelné pomocí indexů v rozmezí 0 až 9 indexy prvků noty [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] hodnoty: 8 5 10 47 -1 32 -8 9 75 18/07/2018
Jednorozměrné pole (3) Zpřístupnění jednoho prvku v poli: idPole[výraz] idPole: identifikátor proměnné typu pole výraz: výraz, jehož vyhodnocením je dán index prvku v poli (tzv. indexový výraz) Příklad: hodnoty[5] zpřístupní prvek s indexem 5 (tj. 6. prvek) v poli hodnoty (prvek s hodnotou –1) 18/07/2018
Jednorozměrné pole (4) Hodnotu prvku v poli je možné použít stej-ným způsobem jako proměnnou nebo kons-tantu odpovídajícího datového typu Pozor: hodnoty indexů (indexových výrazů) určujících prvek pole by neměly nikdy nabýt hodnoty mi-mo definicí určené meze pokus o práci s hodnotami mimo meze pole (např. hodnoty[10]=100) není jazykem C kontrolován a vede obvykle k havárii programu 18/07/2018
Jednorozměrné pole (5) Definice proměnné typu pole může být spo-jena i s inicializací jednotlivých jeho prvků: datový_typ idPole[velikost]= {h0, h1, …, hvelikost–1}; h0, h1, …, hvelikost–1: hodnoty (popř. konstantní výrazy), které jsou typově kompatibilní s typem prvků pole (tj. s datovým typem datový_typ) tyto hodnoty (výsledky konstantních výrazů) se postupně (zleva doprava) přiřadí do jednotlivých prvků pole 18/07/2018
Jednorozměrné pole (6) Příklad: int drMoc[5]={0, 1, 4, 9, 16}; definuje proměnnou drMoc s následujícími iniciálními hodnotami: [0] [1] [2] [3] [4] drMoc: 1 4 9 16 Výčet hodnot v inicializaci prvků pole nemu-sí být úplný Zbývající prvky se nastaví na hodnotu 0 18/07/2018
Jednorozměrné pole (7) Příklad: int pole[5]={7, [3]=2}; definuje proměnnou pole s následujícími iniciálními hodnotami: [0] [1] [2] [3] [4] pole: 7 2 Je-li při definici pole uvedena i inicializace, pak může být vynechán výraz udávající jeho velikost 18/07/2018
Jednorozměrné pole (8) Počet prvků pole je dán počtem hodnot ve složených závorkách Příklad: int moc2[]={1, 2, 4, 8, 16, 32}; definuje proměnnou moc2 se šesti prvky a s následujícími iniciálními hodnotami: [0] [1] [2] [3] [4] [5] moc2: 1 2 4 8 16 32 18/07/2018
Jednorozměrné pole (9) Jazyk C neposkytuje operátor pro přiřazení pole jako celku Kopie pole se musí provádět samostatným ko-pírováním jednotlivých prvků (v rámci cyklu) nebo kopií bloku paměti Při načítání (zobrazování) prvků pole pomocí funkcí scanf (printf) je rovněž nutné po-stupovat po jednotlivých prvcích 18/07/2018
Ukazatele a pole (1) Mezi ukazateli a poli je v jazyce C velmi těsný vztah Operace, které lze provádět pomocí indexů polí, lze také provádět pomocí ukazatelů Verze s ukazateli bývá obecně rychlejší, ale může být hůře pochopitelná Nechť: int a[10], x; definuje pole a o 10 prvcích typu int a pro-měnnou x také typu int 18/07/2018
Ukazatele a pole (2) Zápis a[i] odkazuje na prvek s indexem i [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] a: Zápis a[i] odkazuje na prvek s indexem i Nechť je dán ukazatel ptrInt definovaný jako: int *ptrInt; Pak přiřazení ptrInt = &a[0] nastaví uka-zatel ptrInt tak, že bude ukazovat na prvek pole a s indexem 0 18/07/2018
Ukazatele a pole (3) Ukazatel ptrInt obsahuje adresu prvku a[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] a: ptrInt: Ukazatel ptrInt obsahuje adresu prvku a[0] Přiřazení: x = *ptrInt; zkopíruje obsah a[0] do proměnné x 18/07/2018
Ukazatele a pole (4) Ukazuje-li ukazatel ptrInt na konkrétní prvek pole, pak: ptrInt+i ukazuje na i-tý následující prvek ptrInt–i ukazuje na i-tý předcházející prvek Jestliže ukazuje ptrInt na prvek a[0], po-tom: *(ptrInt+1) odkazuje na obsah proměnné a[1] *(ptrInt+i) odkazuje na obsah proměnné a[i] 18/07/2018
Ukazatele a pole (5) [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] a: ptrInt: ptrInt+1: ptrInt+2: ptrInt+9: 18/07/2018
Ukazatele a pole (6) Uvedené odkazy jsou platné nezávisle na veli-kosti proměnných v poli a V aritmetice ukazatelů platí, že: ptrInt+1 ukazuje na následující objekt za objektem ptrInt ptrInt+i ukazuje na i-tý objekt za objektem ptrInt V jazyce C je jméno pole synonymem pro umístění jeho počátečního prvku 18/07/2018
Ukazatele a pole (7) Z toho vyplývá, že přiřazení: ptrInt = &a[0]; je ekvivalentní přiřazení ptrInt = a; Odkaz na prvek a[i] lze také zapsat jako *(a+i) Výraz a+i je adresou i-tého prvku za a a je totožný s výrazem &a[i] Jestliže ptrInt je ukazatel, pak je možné jej indexovat, tj. ptrInt[i] je ekvivalentní *(ptrInt+i) 18/07/2018
Ukazatele a pole (8) Pozor: ukazatel je proměnná, tj. výrazy: ptrInt = a ptrInt++ jsou správné jméno pole nepředstavuje proměnnou, tj. výrazy: a = ptrInt a++ jsou chybné 18/07/2018