Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Typ ukazatel (1) Proměnné typu ukazatel (pointer) uchovávají paměťovou adresu Hodnota ukazatele říká, kde (na jaké adrese) se v paměti nachází nějaký objekt.

Podobné prezentace


Prezentace na téma: "Typ ukazatel (1) Proměnné typu ukazatel (pointer) uchovávají paměťovou adresu Hodnota ukazatele říká, kde (na jaké adrese) se v paměti nachází nějaký objekt."— Transkript prezentace:

1 Typ ukazatel (1) Proměnné typu ukazatel (pointer) uchovávají paměťovou adresu Hodnota ukazatele říká, kde (na jaké adrese) se v paměti nachází nějaký objekt (hodnota určitého datového typu), tj. ukazuje na hodno-tu určitého datového typu Při definici proměnné typu ukazatel je specifi-kován i datový typ udávající informaci o typu hodnoty, která je na adrese dané ukazatelem očekávána 12/01/2019

2 Typ ukazatel (2) Definice proměnné typu ukazatel: datový_typ *idPromenne; definuje proměnnou idPromenne, jejíž hodnota může obsahovat adresu, na níž je uložena hodnota typu datový_typ Příklad: int *ptrInt; proměnná ptrInt může obsahovat adre-su, na níž je uložena hodnota typu int 12/01/2019

3 Typ ukazatel (3) Jazyk C poskytuje dva operátory pro práci s proměnnými typu ukazatel: * dereferenční: vrací hodnotu uloženou na adrese operandu & referenční: vrací adresu operandu (proměnné) Příklad: ptrInt: představuje adresu paměti *ptrInt: označuje místo v paměti, se kterým lze pracovat jako s proměnnou ty- pu int (obsah adresy uložené v ptrInt) 12/01/2019

4 Typ ukazatel (4) Nechť: int *ptrInt; int k = 11; ptrInt = &k;
adresa ptrInt adresa k Nechť: int *ptrInt; int k = 11; Adresy 1000 1032 1064 1096 Hodnoty 11 adresa ptrInt adresa k ptrInt = &k; *ptrInt = 80; Adresy 1000 1032 1064 1096 Hodnoty 1064 80 12/01/2019

5 Typ ukazatel (5) Příklad: int x = 1, y = 2; int *ptrInt; ptrInt = &x;
12/01/2019

6 Typ ukazatel (6) y = *ptrInt; *ptrInt = 0; x: 1 y: 1 ptrInt: x: y: 1
y: 1 ptrInt: 12/01/2019

7 Typ ukazatel (7) V hlavičkovém souboru stdio.h je defi-nována konstanta NULL vyjadřující prázd-ný ukazatel Konstantu NULL lze přiřadit každému uka-zateli bez ohledu na datový typ, na nějž ukazuje Má-li ukazatel hodnotu NULL, pak to zna-mená, že neukazuje na žádný objekt v pa-měti 12/01/2019

8 Typ ukazatel (8) Na jeden objekt může obecně ukazovat vět-ší množství ukazatelů, pomocí nichž lze provést jeho zpřístupnění Hodnoty typu ukazatel je možné porovnávat pomocí relačních operátorů Rovnost (resp. nerovnost) ukazatelů lze in-terpretovat jako test, zda-li dva ukazatele ukazují (resp. neukazují) na stejný objekt 12/01/2019

9 Typ ukazatel (9) Poznámka (obecný ukazatel):
používán pro ukazatele, které neukazují na hodnoty žádného konkrétního typu zapisován pomocí datového typu void např. void *ukazatel; datový typ void * lze následně přetypovat na libovolný typový ukazatel ukazatel typu void * lze přiřadit jakémukoliv ukazateli 12/01/2019

10 Agregované typy dat (1) Identifikátor proměnné agregovaného (slože-ného, strukturovaného) datového typu ozna-čuje obecně větší množství hodnot, které spolu souvisí Agregované typy jsou kompozicí jiných typů Agregovaný datový typ je určen typem struk-turování a typem složek, z nichž je tvořen (tyto složky mohou být opět agregované) 12/01/2019

11 Agregované typy dat (2) Agregovaný typ je charakterizován svým:
konstruktorem: mechanismus, který určuje, jak konstruovat hodnotu agregovaného typu z jejích komponent (složek) selektorem: mechanismus určující způsob přístu pu k jednotlivým složkám (výběr složky) Každá hodnota agregovaného typu má něko-lik komponent: téhož typu – homogenní datový typ (pole) různých typů – heterogenní datový typ (struktura) 12/01/2019

12 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ý 12/01/2019

13 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) 12/01/2019

14 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 12/01/2019

15 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 12/01/2019

16 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) 12/01/2019

17 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 12/01/2019

18 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 12/01/2019

19 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 12/01/2019

20 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 12/01/2019

21 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 12/01/2019

22 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 12/01/2019

23 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 12/01/2019

24 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 12/01/2019

25 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 12/01/2019

26 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] 12/01/2019

27 Ukazatele a pole (5) [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] a:
ptrInt: ptrInt+1: ptrInt+2: ptrInt+9: 12/01/2019

28 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 12/01/2019

29 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) 12/01/2019

30 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é 12/01/2019


Stáhnout ppt "Typ ukazatel (1) Proměnné typu ukazatel (pointer) uchovávají paměťovou adresu Hodnota ukazatele říká, kde (na jaké adrese) se v paměti nachází nějaký objekt."

Podobné prezentace


Reklamy Google