Ukazatele BI-PA1 Programování a algoritmizace 1, ZS 2012-2013 Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.

Slides:



Advertisements
Podobné prezentace
Počítače a programování 1 Přednáška 13 Jiří Šebesta.
Advertisements

Projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem ČR.
Racionální čísla, operátory, výrazy, knihovní funkce
Programování 2 Cvičení 5.
Pole, ukazatele a odkazy
Strukturované datové typy
Algoritmizace a programování Operátory a příkazy v Delphi - 07
Otázky k absolutoriu HW 1 - 5
Cvičení 2 Proměnné(jednoduché a složené) a konstanty První program Zápis výrazů.
Druhé cvičení Vytváření identifikátorů Datové typy
Programování v Pascalu Přednáška 7
Operátory (1. část) 3 A1PRG - Programování – Seminář
Struktury, qsort, mergesort BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií.
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.
OSNOVA: a) Řetězce v C b) Funkce stdio.h pro řetězce c) Funkce string.h pro řetězce d) Příklad Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Seminář C cvičení STL, Trolltech Ing. Jan Mikulka.
Nové modulové výukové a inovativní programy - zvýšení kvality ve vzdělávání Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem.
C# - pointery Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Ing. Josef Veselý Označení šablony a vzdělávací sady viz.rozpis.
DEKLARACE PROMĚNNÝCH A KONSTANT
Současný svět Projekt č. CZ /3. 1
Časová složitost algoritmů, řazení a vyhledávání
A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze
OSNOVA: a)Programování se soubory b)Záloha databáze v souboru c) Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování.
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro vstup a výstup 12 Verze
C# - předávání parametrů Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.
Spojové struktury BI-PA1 Programování a algoritmizace 1, ZS
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ý.
Nové modulové výukové a inovativní programy - zvýšení kvality ve vzdělávání Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem.
OSNOVA: a)Funkce – úvod b) Hlavičky funkcí c) Rekurze funkcí d)Knihovny funkcí e)Příklady Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače.
Realloc a qsort examples BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
Jak pracuje počítač Název školy
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.
Vazby dynamických proměnných,databázové systémy Přednáška č. 10.
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.
Soubory BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
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.
Dejvice Matěj Volf Seminář Město v dějinách Aktivita č. 1 Praha – město našeho života Projekt č. CZ.2.17/3.1.00/36097, podpořený Evropským sociálním fondem.
Funkce, intuitivní chápání složitosti
Úvod do programování2 Vyučující: Mgr. Vítězslav Jersák Web: xjv.webnode.cz.
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY Datové typy a operátory Základní programové.
Pojmy a názvy 2 Předmět: Informační a komunikační technologie Autor: Milan Franek.
Vývoj architektur mikroprocesorů Od 4 bitů k superskalárnímu RISC Vývoj architektur mikroprocesorů Od 4 bitů k superskalárnímu RISC Pavel Píša
Programování OPERÁTOR SIZEOF, FUNKCE, POLE JAKO PARAMETRY FUNKCÍ ERIK KRÁL.
Počítače a programování 2
Financováno z ESF a státního rozpočtu ČR.
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é.
Algoritmizace a programování
Výukový materiál zpracován v rámci projektu
Úvod do informačních technologií autor Mgr. Jana Truxová
Výukový materiál zpracován v rámci projektu
Výukový materiál zpracován v rámci projektu
Mikropočítač Soubor instrukcí
Struktury.
Algoritmizace a programování
Programování v jazyce C++
Vysoké učení technické v Brně
Výukový materiál zpracován v rámci projektu
INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ
Úloha syntézy čtyřčlenného rovinného mechanismu
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.
Algoritmizace a datové struktury (14ASD)
Opakování ze 3. cvičení deklarace proměnných výpis na monitor (výstup)
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:

Ukazatele BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké učení technické Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Ukazatele proměnná typu ukazatel operace reference operace dereference kompatibilita ukazatelů ukazatelová aritmetika pole a ukazatele dynamické proměnné dealokace dynamických proměnných 2/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Paměť počítače Víte, jak velkou paměť má váš počítač? Ovládací panely/Systém Víte, kolik je 1KiB,1kB, 1MB, 1GiB(ČSN IEC , 1998)? JednotkaZnačkaBkBKiB KilobytekB10001~0,9766 KibibyteKiB10241,0241 MegabyteMB ~976,6 MebibyteMiB ~1048,61024 GigabyteGB ,5 GibibyteGiB2 30 bytů ~ prog8-mocniny2.c Jak vypsat adresy proměnných? prog8-adresy.c 3/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Ukazatele Obsah proměnné typu ukazatel na T se chápe jako adresa proměnné typu T (známe již parametry typu ukazatel) Proměnnou p typu ukazatel na T zavedeme deklarací T *p; Tuto proměnnou můžeme inicializovat ukazatelem na proměnnou x typu int (adresou proměnné x) T *p = &x; nebo ji přiřadit ukazatel na proměnnou x typu int (adresu proměnné x) p = &x ; Unární prefixový operátor & označuje operaci reference Je-li X proměnná typu T, pak výsledkem operace &X je ukazatel na proměnnou X (adresa proměnné X) a je typu T*, tzn. ukazatel na T Příklad (prog8-ukazatele1.c) int i, *pi = &i; char c, *pc; pc = &c; 4/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Ukazatele Nebudeme se zabývat číselnými adresami Skutečnost, že proměnná p typu ukazatel obsahuje adresu proměnné x vyjádříme šipkou z p na x Předchozí příklad ještě jednou: int i, *pi = &i; char c, *pc; pc = &c; i pi c pc int i, *pi = &i; char c, *pc; *pc = &c; 5/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dereference Chceme-li použít proměnnou, na kterou ukazuje ukazatel, vyjádříme to pomocí unárního operátoru dereference * Je-li X ukazatel typu T*, pak *X označuje proměnnou typu T, na kterou ukazuje ukazatel X Příklad (prog8-ukazatele2.c) int i, *pi = &i; char c, *pc; pc = &c; *pi = 10; *pc = ‘a’; i pi c pc 10 ‘a’ *pi *pc 6/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Přiřazení ukazatelů Pro typ ukazatel na T (T*) typ T nazýváme doménovým typem ukazatele Kompatibilními typy ukazatel jsou takové, které mají stejný doménový typ Proměnné typu ukazatel je třeba přiřadit kompatibilní ukazatel int i, *pi; char c, *pc; pi = &i; /* kompatibilni typy */ pi = &c;/* nekompatibilni typy */ Přiřazení nekompatibilního ukazatele je v C pouze varovné hlášení int* char* 7/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Přiřazení ukazatelů Co může způsobit, přiřadíme-li proměnné nekompatibilní ukazatel int i, *pi; char c, *pc; pi = &c; /* promenna typu int* ukazuje na promennou typu char */ pc = &i; /* promenna typu char* ukazuje na promennou typu int */ *pi = 0; /* vynuluji se 4 byty pocinaje adresou ulozenou v pi */ *pc = 0; /* vynuluje se byte na adrese ulozene v pc */ viz příklad prog8-ukazatele3.c 8/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Přiřazení ukazatelů, poznámka Uložení čísla int 0x4A 3B 2C 1D v paměti počítače: Little endian (Intel) 1D 2C 3B 4A (adresy rostou doprava) Big endian (Motorola, SPARC, IBM) 4A 3B 2C 1D Middle-endian (Mixed endian) 3B 4A 1D 2C nebo 2C 1D 4A 3B Bi-endian (umí přepínat) ARM, PowerPC, Alpha, SPARC V9, MIPS, PA-RISC and IA64) 9/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 NULL ukazatel Jako „prázdný, neplatný“ ukazatel, který neukazuje na žádnou proměnnou, slouží v jazyku C hodnota 0 Symbolickým označením tohoto ukazatele je NULL Dereference prázdného ukazatele způsobí chybu při běhu programu Příklad prog8-ukazatele4.c: int main(void) { int *p = NULL; *p = 10; system(”PAUSE”); return 0; } 10/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Ukazatelová aritmetika Ukazatelé mohou být operandy sčítání, odčítání a všech relačních operátorů Dovolené kombinace a typ výsledku: T* + int -> T* T* - int -> T* T* - T* -> int T* relop T* -> int Přičtení n k ukazateli typu T* znamená jeho změnu o n-násobek délky typu T, podobně odečtení a rozdíl ukazatelů int a[10], *p = &a[0]; *(p + 3) = 10;/* do a[3] se uloží 10 */ /* vynulování pole a */ for (p = &a[0]; p <= &a[9]; p++) *p = 0; /* nebo */ for (p = &a[0]; p <= &a[9]; *p++ = 0); 11/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Pole a ukazatele Jméno pole prvků typu T = konstantní ukazatel typu T* ukazující na prvek s indexem 0 int a[10], *pa, i; pa = a;totéž co pa = &a[0] *(a + 2) = 3; totéž co a[2] = 3 *(a + i) = 4;totéž co a[i] = 4; for (pa = a; pa <= a + 9; *pa++ = 0); a++; Chyba (proč?) Upřesnění indexace: X [ Y ], kde první výraz je typu ukazatel na T a druhý typu int, výsledek je typu T Výraz X [ Y ] je ekvivalentní s *( ( X ) + ( Y ) ) pa[3] = 10; totéž co *(pa + 3) = 10; 12/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Pole a ukazatele Podívejte se na příklad prog8-vektory1.c skalární součin dvou vektorů, parametry funkcí specifikovány jako ukazatele... void ctiVektor(int *v, int n) { int i; printf “zadejte %d celych cisel\n”, n); for (i=0; i<n; i++) scanf(” %d”, &v[i]); } 13/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Pole a ukazatele Podívejte se na příklad prog8-vektory2.c skalární součin dvou vektorů, průchody polem pomocí ukazatelové aritmetiky void ctiVektor(int v[], int n) { int *p, *pn = v+n; printf(“zadejte %d celych cisel\n”, n); for (p=v; p<pn; p++) scanf(”%d”, p); } void ctiVektor(int *v, int n) { int i; printf(“zadejte %d celych cisel\n”, n); for (i=0; i<n; i++) scanf(”%d”, &v[i]); } 14/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Řetězce a ukazatele - PALINDROM Palindrom je alespoň dvojznakové slovo, které vychází stejně čteno odpředu i odzadu, např. kajak Pro zjištění, zda slovo je palindrom, zavedeme funkci #define MAXDELKA 100 int jePalindrom(char *s); int main(void) { char slovo[MAXDELKA+1]; printf(”zadejte slovo obsahujici nanejvys %d znaku: “, MAXDELKA); scanf(”%s”, slovo); printf(”zadali jste %s\n”, slovo); printf(”toto slovo”); if (jePalindrom(slovo)) printf(”je”); else printf(”neni”); printf(” palindrom\n”);... } nepochopen nepotopen Dne moto: Palindrom i spáchá psí mord, Nil a potom End. 15/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Řetězce a ukazatele Jak zjistit, že slovo je palindrom slovo délky d bude uloženo v poli s počínaje indexem 0 a konče indexem d-1 (hodnotou prvku s indexem d bude závěrečná nula) aby slovo bylo palindrom, musí platit: s[0] == s[d-1] s[1] == s[d-2]... test na rovnost skončíme, až dosáhneme poloviny délky slova Řešení (prog8-palindrom1.c): int jePalindrom(char *s) { int delka = strlen(s), polovina = delka/2, i; for (i=0; i<polovina; i++) if (s[i]!=s[delka-i-1]) return 0; return 1; } 16/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Řetězce a ukazatele Testy rovnosti znaků můžeme provádět pomocí dvou proměnných typu ukazatel na char, z nichž první nastavíme na první znak a budeme ji zvětšovat a druhou nastavíme na poslední znak a budeme ji zmenšovat Test budeme opakovat, pokud první ukazatel bude menší než druhý ukazatel Řešení (prog8-palindrom2.c): int jePalindrom(char *s) { char *p, *q; for (p=s, q=s+strlen(s)-1; p<q; p++,q--) if (*p != *q) return 0; return 1; } 17/26 int jePalindrom(char *s) { char p=s, q=s+strlen(s)-1; while (p<q) if (*p++ != *q--) return 0; return 1; }

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Řetězce a ukazatele A něco na závěr řetězců a ukazatelů Literál tvořený posloupností znaků, která je uzavřena do uvozovek, je typu char* (připomeňme, že v paměti je reprezentován posloupností znaků zakončenou nulovým bytem) Podívejte se na příklad prog8-palindrom3.c #define SLOVO “kajak” int jePalindrom(char *s); int main(void) { printf(”slovo %s”, SLOVO); if (jePalindrom(SLOVO)) printf(”je”); else printf(”neni”); printf(” palindrom\n”); jePalindrom(”abcd”); return 0; } 18/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dynamické proměnné Ukazatele v jazyku C slouží především pro: předávání výstupních parametrů procedurám a funkcím předávání pole jako parametru procedurám a funkcím přístup k dynamickým proměnným Dynamická proměnná není zavedena deklarací, ale je vytvořena speciální funkcí (operátorem, příkazem) Dynamická proměnná nemá jméno, a proto k ní můžeme přistupovat pouze pomocí ukazatele (adresy) V jazyku C vytvoříme dynamickou proměnnou pomocí funkce malloc parametrem funkce je počet bytů, které budou vnitřní reprezentací proměnné funkce „zařídí“, že ve volné paměti je rezervováno místo pro proměnnou s danou velikostí vnitřní reprezentace a jejím výsledkem je adresa tohoto místa (tzn. ukazatel na dynamicky vytvořenou proměnnou) funkce je deklarována tak, že vrací výsledek typu void*; volání funkce je proto třeba přetypovat 19/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dynamické proměnné Příklad (prog8-dynprom.c) int main(void) { int *p; p = (int *)malloc(sizeof(int)); *p = 10; printf(”*p=%d\n”, *p); system(”PAUSE”); return 0; } Jak je to v paměti počítače zásobníkhalda přetypování na typ int* p 10 20/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dynamicky vytvořené pole Dynamicky vytvořené proměnné jednoduchých typů obvykle nejsou třeba Užitečné je dynamicky vytvořené pole Příklad: skalární součin dvou vektorů, počet složek je dán vstupními daty funkce ctiVektor dynamicky vytvoří pole, jehož délka je dána parametrem, a přečte jeho prvky z klávesnice int *ctiVektor(int n) { int i, *p; p = (int *)malloc(sizeof(int)*n); printf(”zadejte %d celych cisel\n”, n); for (i=0; i<n; i++) scanf(”%d”, &p[i]); return p; } Ve funkci main nebudou deklarována pole, ale proměnné typu ukazatel, do nichž se uloží adresy polí dynamicky vytvořených funkcí ctiVektor 21/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dynamicky vytvořené pole prog8-dynpole.c int ctiInt(int min, int max) {...} int *ctiVektor(int n) {...} int skalarniSoucin(int x[], int y[], int n) {...} int main(void) { int *x, *y, n; printf(”zadejte pocet slozek vektoru: “); n = ctiInt(1, INT_MAX); printf(”vektor x\n”); x = ctiVektor(n); printf(”vektor y\n”); y = ctiVektor(n); printf(”skalarni soucin vektoru x a y je %d\n”, skalarniSoucin(x, y, n)); return 0; } 22/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dealokace Příklad: int *p, *q; p = (int *)malloc(sizeof(int)); q = (int *)malloc(sizeof(int)); *p = 10; *q = 20; 10 p q 20 23/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dealokace Příklad: int *p, *q; p = (int *)malloc(sizeof(int)); q = (int *)malloc(sizeof(int)); *p = 10; *q = 20; q = p; Co s dynamicky vytvořenou proměnnou s hodnotpu 20, na kterou ukazovala proměnná q (není přístupná)? Před ztrátou ukazatele na ni je třeba ji dealokovat (vrátit paměť, kterou zabírá, zpět do volné paměti) 10 p q 20 24/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Dealokace Dealokaci provádí funkce free int *p, *q; p = (int*)malloc(sizeof(int)); q = (int*)malloc(sizeof(int)); *p = 10; *q = 20; free(q); q = p; Paměť přidělená modře zarámované proměnné se uvolní a je k dispozici pro další malloc 10 p q 20 25/26

Ing. Miroslav Balík, Ph.D. - BI-PA1- 08 Pamět počítače program vytvořený překladačem jazyka C využívá pěti úseků paměti: paměť kódu paměť konstant paměť globálnich proměnných zásobník pro přidělení paměti parametrům a lokálním proměnným funkcí paměť pro dynamické proměnné Podívejte se na program prog8-pamet.c, který vypíše adresy z těchto úseků 26/26