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.

Slides:



Advertisements
Podobné prezentace
A1PRG - Programování – Seminář Ing. Michal Typová konverze, oblast platnosti, paměťové třídy 9 Verze
Advertisements

Standardní knihovní funkce pro práci s textovými řetězci
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
ŘÍDÍCÍ STRUKTURY - PODMÍNKY
Počítače a programování 1 Přednáška 13 Jiří Šebesta.
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Programování 2 Cvičení 5.
DATOVÝ TYP POLE.
25/08/20141 Typ struktura (1) Datový typ struktura ( struct ) je agrego- vaný heterogenní datový typ Jedná se o skupinu několika proměnných, které mohou.
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Strukturované datové typy
Cvičení 2 Proměnné(jednoduché a složené) a konstanty První program Zápis výrazů.
Principy překladačů Mezikód Jakub Yaghob.
ADT Strom.
Lineární algebra.
Datové struktury. 2 Co je datová struktura v C datový typ složený z jiných datových typů nejjednodušší datová struktura je pole. všechny jeho prvky jsou.
C# - struktury, výčtové typy, pole
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
Vyučovací hodina 1 vyučovací hodina: Opakování z minulé hodiny 5 min Nová látka 20 min Procvičení nové látky 15 min Shrnutí 5 min 2 vyučovací hodiny: Opakování.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
MATEMATIKA I.
Dostupné z Metodického portálu ISSN: , financovaného z ESF a státního rozpočtu ČR. Provozováno Výzkumným ústavem pedagogickým v Praze.
DEKLARACE PROMĚNNÝCH A KONSTANT
KOMBINAČNÍ LOGICKÉ FUNKCE
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
Počítače a programování 1
JavaScript Podmínky, cykly a pole.
Cvičení.
Fakulta životního prostředí Katedra informatiky a geoinformatiky
Datové typy a struktury
Gymnázium prof. Jana Patočky Jindřišská Praha 1 „Praha & EU: Investujeme do vaší.
10. Dynamické proměnné Dynamická proměnná se nezavádí deklarací proměnných, ale vzniká za běhu programu provedením speciálního příkazu. Nemá přidělen žádný.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
A1PRG - Programování – Seminář Ing. Michal Řízení běhu programu 5 Verze
Ukazatele BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Vektorové prostory.
STRING A UKAZATELE. Co to je řetězec? Řetězec v Javě je samostatný objekt. Je konstantní, co znamená, že jednou vytvořený řetězec nelze změnit. Chceme-li.
Počítače a programování 1 7.přednáška. Základy Pole ve třídách a metodách Pole Arrays.
OSNOVA: a) Ukazatel b) Pole a ukazatel c) Pole ukazatelů d) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro.
Ukazatele, řetězce Přednáška č. 3. Ukazatele  Ukazatel (pointer) – typ o velikosti 4 bajty (v 32bit. systémech) pro uložení adresy objektu na který ukazuje.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
České vysoké učení technické Fakulta elektrotechnická Datové typy, výrazy vstup, výstup Jazyk JAVA A0B36PRI - PROGRAMOVÁN Í v1.02.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Úvod do programování2 Vyučující: Mgr. Vítězslav Jersák Web: xjv.webnode.cz.
Úvod do databází zkrácená verze.
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
Matice Přednáška č.4. Definice: Soubor prvků nazýváme maticí typu i-tý řádek j-tý sloupec prvky matice.
Programování OPERÁTOR SIZEOF, FUNKCE, POLE JAKO PARAMETRY FUNKCÍ ERIK KRÁL.
Typ struktura (1) Datový typ struktura (struct) je agrego-vaný heterogenní datový typ Jedná se o skupinu několika proměnných, které mohou mít různé datové.
OPERAČNÍ SYSTÉMY Část 4 – správa souborů
Programovací jazyk C# 4. část - cykly.
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Vícerozměrná pole (1) Jazyk C povoluje, aby pole mělo více rozměrů (dimenzí) než jeden Z vícerozměrných polí bývá nejčastěji použí-váno pole dvourozměrné.
Definiční obor a obor hodnot
Výukový materiál zpracován v rámci projektu
Vzorové řešení zápočtového testu
Programování v jazyce C++
Funkce výstupu (2) Funkce printf: deklarována v: stdio.h
Datové typy v jazyce C Datové typy void skalární aritmetické
Reálné typy (1) Zahrnují konečnou podmnožinu těch reálných čísel, která jsou zobrazitelná v paměti počítače (v jistém rozsahu a s jistou přesností) Hodnoty.
Příkazy cyklu (1) Umožňují vícekrát (nebo ani jednou) pro-vést určitý příkaz Jazyk C rozlišuje příkaz cyklu: s podmínkou na začátku: obecný tvar: while.
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
Oblast platnosti identifikátoru (1)
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.
C# přehled vlastností.
Cyklus for (1) Obecný tvar: for (výraz1; výraz2; výraz3) příkaz
Proměnné (1) Proměnná: Definice proměnných:
Datové typy v jazyce C Datové typy void skalární aritmetické
Union neboli sjednocení Bitová pole
Transkript prezentace:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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