Ukazatele. 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)?

Podobné dokumenty
BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Funkce, intuitivní chápání složitosti

Ukazatele, dynamická alokace

Pointery II. Jan Hnilica Počítačové modelování 17

Mělká a hluboká kopie

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Více o konstruktorech a destruktorech

Operační systémy. Cvičení 4: Programování v C pod Unixem

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Ukazatele #2, dynamická alokace paměti

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Algoritmizace a programování

Ukazatele #1, struktury

Programování v C++, 2. cvičení

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Dynamické programování

Jazyk C++, některá rozšíření oproti C

IUJCE 07/08 Přednáška č. 6

Př. další použití pointerů

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

Základy C++ I. Jan Hnilica Počítačové modelování 18

ZÁKLADY INFORMATIKY 14ZINF. Číselné soustavy

Paměť počítače. alg2 1

Základy programování (IZP)

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

ALGORITMIZACE A DATOVÉ STRUKTURY (14ASD) 1. cvičení

Způsobilost. Data a parametry. Menu: QCExpert Způsobilost

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Základy programování (IZP)

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Abstraktní třídy, polymorfní struktury

S y s t é m e l e k t r o n i c k é h o b a n k o v n i c t v í. Napojení na účetní systémy popis exportních / importních souborů

Úvod do programovacích jazyků (Java)

Pokud světlo prochází prostředím, pak v důsledku elektromagnetické interakce s částicemi obsaženými

Základy programování (IZP)

Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů

Lineární spojový seznam (úvod do dynamických datových struktur)

Struktura programu v době běhu

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Algoritmizace a programování

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Analytická metoda aneb Využití vektorů v geometrii

Racionální čísla, operátory, výrazy, knihovní funkce

Výrazy, operace, příkazy

Dynamická alokace paměti

Systémové struktury - základní formy spojování systémů

BI-EP1 Efektivní programování 1

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel. 7., 9. a 10. listopadu 2017

Základy programování (IZP)

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

ZÁKLADY AUTOMATICKÉHO ŘÍZENÍ

Úvod do programovacích jazyků (Java)

Rozklad problému na podproblémy, rekurze

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Rekurzivní algoritmy

Úvod do programování - Java. Cvičení č.4

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Programování v jazyce JavaScript

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel. 10., 12. a 13. října 2017

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Racionální čísla, operátory, výrazy, knihovní funkce

1. série. Různá čísla < 1 44.

Řídící struktury, if, while, switch

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Výrazy, operace, příkazy

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

2 Datové typy v jazyce C

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

4. Typ ukazatel, strukturované datové typy

Programování v jazyce JavaScript

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Směrová kalibrace pětiotvorové kuželové sondy

Práce s polem a pamětí

Konstruktory a destruktory

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

Úvod do programování 7. hodina

Programovací jazyk C++ Hodina 1

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2013/2014 Radim Farana. Obsah. Strom

Model tenisového utkání

Implementace numerických metod v jazyce C a Python

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Spojová implementace lineárních datových struktur

Úlohy domácí části I. kola kategorie C

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Transkript:

1 Přírava studijního rogramu Informatika je odorována rojektem financovaným z Evroského sociálního fondu a rozočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti roměnná tyu ukazatel oerace reference oerace dereference komatibilita ukazatelů ukazatelová aritmetika ole a ukazatele dynamické roměnné dealokace dynamických roměnných BI-PA1 Programování a algoritmizace 1, ZS 2012-2013 Katedra teoretické informatiky Miroslav Balík Fakulta informačních technologií České vysoké učení technické 2/26 Paměť očítače Víte, jak velkou aměť má váš očítač? Ovládací anely/systém Víte, kolik je 1KiB,1kB, 1MB, 1GiB(ČSN IEC 60027-2, 1998)? Jednotka Značka B kb KiB Kilobyte kb 00 1 ~0,9766 Kibibyte KiB 24 1,024 1 Megabyte MB 1 000 000 00 ~976,6 Mebibyte MiB 1 048 576 ~48,6 24 Gigabyte GB 9 1 000 000 976 562,5 Gibibyte GiB 2 30 bytů ~1 073 742 1 048 576 rog8-mocniny2.c Jak vysat adresy roměnných? rog8-adresy.c Obsah roměnné tyu ukazatel na T se cháe jako adresa roměnné tyu T (známe již arametry tyu ukazatel) Proměnnou tyu ukazatel na T zavedeme deklarací T *; Tuto roměnnou můžeme inicializovat ukazatelem na roměnnou x tyu int (adresou roměnné x) T * = &x; nebo ji řiřadit ukazatel na roměnnou x tyu int (adresu roměnné x) = &x; Unární refixový oerátor & označuje oeraci reference Je-li X roměnná tyu T, ak výsledkem oerace &X je ukazatel na roměnnou X (adresa roměnné X) a je tyu T*, tzn. ukazatel na T Příklad (rog8-ukazatele1.c) c = &c; 3/26 4/26 Nebudeme se zabývat číselnými adresami Skutečnost, že roměnná tyu ukazatel obsahuje adresu roměnné x vyjádříme šikou z na x Předchozí říklad ještě jednou: c = &c; i i c c *c = &c; Dereference Chceme-li oužít roměnnou, na kterou ukazuje ukazatel, vyjádříme to omocí unárního oerátoru dereference * Je-li X ukazatel tyu T*, ak *X označuje roměnnou tyu T, na kterou ukazuje ukazatel X Příklad (rog8-ukazatele2.c) c = &c; i i *i *i = ; *c = a ; c c a *c 5/26 6/26

2 Přiřazení ukazatelů Pro ty ukazatel na T (T*) ty T nazýváme doménovým tyem ukazatele Komatibilními tyy ukazatel jsou takové, které mají stejný doménový ty Proměnné tyu ukazatel je třeba řiřadit komatibilní ukazatel int i, *i; int* char* i = &i; /* komatibilni tyy */ int* i = &c; /* nekomatibilni tyy */ Přiřazení ukazatelů Co může zůsobit, řiřadíme-li roměnné nekomatibilní ukazatel int i, *i; i = &c; /* romenna tyu int* ukazuje na romennou tyu char */ c = &i; /* romenna tyu char* ukazuje na romennou tyu int */ *i = 0; /* vynuluji se 4 byty ocinaje adresou ulozenou v i */ Přiřazení nekomatibilního ukazatele je v C ouze varovné hlášení *c = 0; /* vynuluje se byte na adrese ulozene v c */ viz říklad rog8-ukazatele3.c 7/26 8/26 Přiřazení ukazatelů, oznámka Uložení čísla int 0x4A 3B 2C 1D v aměti očítače: Little endian (Intel) 1D 2C 3B 4A (adresy rostou dorava) 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í řeínat) ARM, PowerPC, Alha, SPARC V9, MIPS, PA-RISC and IA64) NULL ukazatel Jako rázdný, nelatný ukazatel, který neukazuje na žádnou roměnnou, slouží v jazyku C hodnota 0 Symbolickým označením tohoto ukazatele je NULL Dereference rázdného ukazatele zůsobí chybu ři běhu rogramu Příklad rog8-ukazatele4.c: int * = NULL; system( PAUSE ); 9/26 /26 Ukazatelová aritmetika Ukazatelé mohou být oerandy sčítání, odčítání a všech relačních oerátorů Dovolené kombinace a ty výsledku: T* + int -> T* T* - int -> T* T* - T* -> int T* relo T* -> int Přičtení n k ukazateli tyu T* znamená jeho změnu o n-násobek délky tyu T, odobně odečtení a rozdíl ukazatelů int a[], * = &a[0]; *( + 3) = ; /* do a[3] se uloží */ /* vynulování ole a */ for ( = &a[0]; <= &a[9]; ++) * = 0; /* nebo */ for ( = &a[0]; <= &a[9]; *++ = 0); Jméno ole rvků tyu T = konstantní ukazatel tyu T* ukazující na rvek s indexem 0 int a[], *a, i; a = a; totéž co a = &a[0] *(a + 2) = 3; totéž co a[2] = 3 *(a + i) = 4; totéž co a[i] = 4; for (a = a; a <= a + 9; *a++ = 0); a++; Chyba (roč?) Uřesnění indexace: X [ Y ], kde rvní výraz je tyu ukazatel na T a druhý tyu int, výsledek je tyu T Výraz X [ Y ] je ekvivalentní s *( ( X ) + ( Y ) ) a[3] = ; totéž co *(a + 3) = ; 11/26 12/26

3 Podívejte se na říklad rog8-vektory1.c skalární součin dvou vektorů, arametry funkcí secifikovány jako ukazatele Podívejte se na říklad rog8-vektory2.c skalární součin dvou vektorů, růchody olem omocí ukazatelové aritmetiky void ctivektor(int *v, int n) { int i; rintf zadejte %d celych cisel\n, n); scanf( %d, &v[i]); void ctivektor(int v[], int n) { int *, *n = v+n; rintf( zadejte %d celych cisel\n, n); for (=v; <n; ++) scanf( %d, ); void ctivektor(int *v, int n) { int i; rintf( zadejte %d celych cisel\n, n); scanf( %d, &v[i]); 13/26 14/26 - PALINDROM Palindrom je alesoň dvojznakové slovo, které vychází stejně čteno odředu i odzadu, nař. kajak Pro zjištění, zda slovo je alindrom, zavedeme funkci #define MAXDELKA 0 int jepalindrom(char *s); char slovo[maxdelka+1]; neochoen neotoen Dne moto: Palindrom i sáchá sí mord, Nil a otom End. rintf( zadejte slovo obsahujici nanejvys %d znaku:, MAXDELKA); scanf( %s, slovo); rintf( zadali jste %s\n, slovo); rintf( toto slovo ); if (jepalindrom(slovo)) rintf( je ); else rintf( neni ); rintf( alindrom\n ); Jak zjistit, že slovo je alindrom slovo délky d bude uloženo v oli s očínaje indexem 0 a konče indexem d-1 (hodnotou rvku s indexem d bude závěrečná nula) aby slovo bylo alindrom, musí latit: s[0] == s[d-1] s[1] == s[d-2] test na rovnost skončíme, až dosáhneme oloviny délky slova Řešení (rog8-alindrom1.c): int delka = strlen(s), olovina = delka/2, i; for (i=0; i<olovina; i++) if (s[i]!=s[delka-i-1]) 15/26 16/26 Testy rovnosti znaků můžeme rovádět omocí dvou roměnných tyu ukazatel na char, z nichž rvní nastavíme na rvní znak a budeme ji zvětšovat a druhou nastavíme na oslední znak a budeme ji zmenšovat Test budeme oakovat, okud rvní ukazatel bude menší než druhý ukazatel Řešení (rog8-alindrom2.c): char *, *q; char =s, q=s+strlen(s)-1; for (=s, q=s+strlen(s)-1; <q; ++,q--) while (<q) if (*!= *q) if (*++!= *q--) 17/26 A něco na závěr řetězců a ukazatelů Literál tvořený oslouností znaků, která je uzavřena do uvozovek, je tyu char* (řiomeňme, že v aměti je rerezentován oslouností znaků zakončenou nulovým bytem) Podívejte se na říklad rog8-alindrom3.c #define SLOVO kajak int jepalindrom(char *s); rintf( slovo %s, SLOVO); if (jepalindrom(slovo)) rintf( je ); else rintf( neni ); rintf( alindrom\n ); jepalindrom( abcd ); 18/26

4 Dynamické roměnné v jazyku C slouží ředevším ro: ředávání výstuních arametrů rocedurám a funkcím ředávání ole jako arametru rocedurám a funkcím řístu k dynamickým roměnným Dynamická roměnná není zavedena deklarací, ale je vytvořena seciální funkcí (oerátorem, říkazem) Dynamická roměnná nemá jméno, a roto k ní můžeme řistuovat ouze omocí ukazatele (adresy) V jazyku C vytvoříme dynamickou roměnnou omocí funkce malloc arametrem funkce je očet bytů, které budou vnitřní rerezentací roměnné funkce zařídí, že ve volné aměti je rezervováno místo ro roměnnou s danou velikostí vnitřní rerezentace a jejím výsledkem je adresa tohoto místa (tzn. ukazatel na dynamicky vytvořenou roměnnou) funkce je deklarována tak, že vrací výsledek tyu void*; volání funkce je roto třeba řetyovat Dynamické roměnné Příklad (rog8-dynrom.c) int *; = (int *)malloc(sizeof(int)); rintf( *=%d\n, *); system( PAUSE ); Jak je to v aměti očítače zásobník řetyování na ty int* halda 19/26 20/26 Dynamicky vytvořené ole Dynamicky vytvořené roměnné jednoduchých tyů obvykle nejsou třeba Užitečné je dynamicky vytvořené ole Příklad: skalární součin dvou vektorů, očet složek je dán vstuními daty funkce ctivektor dynamicky vytvoří ole, jehož délka je dána arametrem, a řečte jeho rvky z klávesnice int *ctivektor(int n) { int i, *; = (int *)malloc(sizeof(int)*n); rintf( zadejte %d celych cisel\n, n); scanf( %d, &[i]); return ; Ve funkci main nebudou deklarována ole, ale roměnné tyu ukazatel, do nichž se uloží adresy olí dynamicky vytvořených funkcí ctivektor Dynamicky vytvořené ole rog8-dynole.c int ctiint(int min, int max) { int *ctivektor(int n) { int skalarnisoucin(int x[], int y[], int n) { int *x, *y, n; rintf( zadejte ocet slozek vektoru: ); n = ctiint(1, INT_MAX); rintf( vektor x\n ); x = ctivektor(n); rintf( vektor y\n ); y = ctivektor(n); rintf( skalarni soucin vektoru x a y je %d\n, skalarnisoucin(x, y, n)); 21/26 22/26 Příklad: = (int *)malloc(sizeof(int)); q = (int *)malloc(sizeof(int)); Příklad: = (int *)malloc(sizeof(int)); q = (int *)malloc(sizeof(int)); q = ; Co s dynamicky vytvořenou roměnnou s hodnotu 20, na kterou ukazovala roměnná q (není řístuná)? Před ztrátou ukazatele na ni je třeba ji dealokovat (vrátit aměť, kterou zabírá, zět do volné aměti) 23/26 24/26

5 Dealokaci rovádí funkce free = (int*)malloc(sizeof(int)); q = (int*)malloc(sizeof(int)); free(q); q = ; Pamět očítače rogram vytvořený řekladačem jazyka C využívá ěti úseků aměti: aměť kódu aměť konstant aměť globálnich roměnných zásobník ro řidělení aměti arametrům a lokálním roměnným funkcí aměť ro dynamické roměnné Paměť řidělená modře zarámované roměnné se uvolní a je k disozici ro další malloc Podívejte se na rogram rog8-amet.c, který vyíše adresy z těchto úseků 25/26 26/26