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ý



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

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

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

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

Základy programování (IZP)

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

8 Třídy, objekty, metody, předávání argumentů metod

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

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

Struktura programu v době běhu

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

Úvod do programovacích jazyků (Java)

Více o konstruktorech a destruktorech

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

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

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

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

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

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

Dynamická alokace paměti

Opakování programování

Základy programování (IZP)

11a Dynamické dvourozměrné pole (obdobně vícerozměrné)

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

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Zápis programu v jazyce C#

Ukazatele, dynamická alokace

Programování v jazyce C a C++

Základy programování (IZP)

konstruktory a destruktory (o)

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ů

přetížení operátorů (o)

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

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Úvod do programování. Lekce 5

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

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

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

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

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Algoritmizace a programování

Programování v jazyce JavaScript

Algoritmizace a programování

Programování v jazyce C a C++

PŘETĚŽOVÁNÍ OPERÁTORŮ

Funkční objekty v C++.

Výrazy, operace, příkazy

typová konverze typová inference

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

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

Práce s polem a pamětí

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

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Odvozené a strukturované typy dat

přetížení operátorů (o)

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

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

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

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

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

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

Výrazy, operace, příkazy

10 Práce s řetězci - pokračování

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

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

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Algoritmizace a programování

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

Teoretické minimum z PJV

Konstruktory a destruktory

PB161 Programování v jazyce C++ Přednáška 4

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

Empty, Null, Nothing, Missing, prázdný řetězec a buňka

Práce s pamětí a předávání parametrů. Úvod do programování 1

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

4. Typ ukazatel, strukturované datové typy

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Generické programování

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

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

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

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

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

Datové typy strana 29

Základy programování (IZP)

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Seminář Java II p.1/43

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

dovolují dělení velkých úloh na menší = dekompozice

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

Transkript:

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ý typem proměnné - ukazatel je tedy adresa společně s typem, který je zde uložen. To umožňuje snadno pracovat s daty uloženými na dané adrese reprezentované ukazatelem - hodnota ukazatele je reprezentována podle paměťového modelu (celé číslo reprezentující paměť, celé číslo reprezentující offset vůči hodnotě registru, dvojice celých čísel (segment/báze a offset vůči ní),...), typ je s ukazatelem spojován v překladači. - neinicializovaný ukazatel míří do místa daného náhodnou hodnotou jeho použití je proto nebezpečné - pro inicializaci ukazatele se používá adresa stávajícího prvku, adresa o kterou se požádá systém (alokace). Nastavení na hodnotu NULL (nullptr) znamená hlášení chyby. To je, že ukazatel není inicializován, nebo že operace jejímž výsledkem měl být ukazatel neproběhla v pořádku.

Proměnné jsou uloženy v paměti za sebou v pořadí definice, od adresy 200H a směrem k vyšším hodnotám. Adresa je reprezentována celým číslem. Zakreslete paměťovou mapu, jestliže definice proměnných je: int a,b; double c; a po průběhu programu: a = sizeof(a); b = sizeof(double); nabývají proměnné hodnoty a = 4 a b = 8; Deklarace pouze oznámí jméno proměnné a její (datový) typ. Na rozdíl od definice, která oznamuje jméno proměnné, její typ a současně vyhradí místo v paměti

adresa 200 204 proměnná a uložená hodnota a 4 b 8 208 c nedefinováno 20F

získání adresy (reference) - definice ukazatele je realizována pomocí typu a hvězdičky (která platí pouze pro jednu proměnnou) - ukazatel by měl obsahovat smysluplnou adresu je ho třeba inicializovat tak aby obsahoval adresu, na které leží stejný typ, jakého je ukazatel - operátor pro získání adresy je & (znak logické and má nyní dva významy) - pro neinicializovaný ukazatel, nebo jako označení chybového stavu se používá konstanta NULL (či nullptr) int *pii, ii; // pii je ukazatel na int, ii už je typu int // v pii i ii jsou nesmysly obě proměnné dosud nebyly inicializovány ii = 0; // inicializace konstantou pii = NULL; // dále lze testovat, zda obsahuje smysluplnou adresu (!= NULL) pii = &ii; // inicializace pomocí adresy existující proměnné // operátor zjistí adresu, na které leží proměnná ii a přiřadí ji do pii. // hodnota pii tedy udává místo v paměti, na kterém leží hodnota typu int (původně ii)

Nakreslete paměťovou mapu pro následující příklad, platí-li pravidla z minulého příkladu a adresa je reprezentována osmi byty. int i = 5; int *pi = &i; //definice s inicializací. Udává místo v paměti, kde leží int int **pii = π // ukazatel na ukazatel. Udává místo v paměti, na kterém leží adresa // na níž leží int int ***piii = &pii; // Udává adresu, na níž leží adresa, na níž leží adresa, na níž je int

adresa počet bytů název / hodnota 200 4 i / 5 204 8 pi / 200 20C 8 pii / 204 214 8 piii / 20C

přístup k prvku na adrese (dereference) - je realizován pomocí operátoru přístupu (dereference) hvězdička, který je aplikován na ukazatel - ukazatel obsahuje adresu a překladač ví jakého je ukazatel typu, takže umí s obsahem pracovat - operátor hvězdička má nyní tři významy (plynoucí z kontextu) jako matematický operátor krát, v definici značí, že se jedná o ukazatel, před ukazatelem znamená, že se pracuje s obsahem na dané adrese int *pii, ii; // pii je ukazatel na int, ii už je typu int ii = 0; // inicializace konstantou pii = &ii; // inicializace pomocí adresy existující proměnné *pii = 10; // v pii je adresa prvku ii. Hvězdička říká, že se pracuje s obsahem // na této adrese. Tento příkaz je tedy ekvivalentní zápisu ii = 10, a zapíše // na adresu (na které leží obsah/hodnota ii) hodnotu 10.

Použijeme-li minulý příklad int i = 5; int *pi = &i; //definice s inicializací. Udává místo v paměti, kde leží int int **pii = π // ukazatel na ukazatel. Udává místo v paměti, na kterém leží adresa // na níž leží int int ***piii = &pii; // Udává adresu, na níž leží adresa, na níž leží adresa, na níž je int potom následující zápisy v řádcích jsou ekvivalentní manipulace s i i = 5 *pi = 5 **pii = 5 ***piii = 5 manipulace s pi pi = 200 *pi = 200 **piii = 200 manipulace s pii pii = 204 *piii = 204 manipulace s piii piii = 20C podobně se mohou vyskytovat i na pravé straně rovná se, nebo jako parametry funkcí

Datový typ void - je úzce spojen s ukazateli - používá se jako univerzální datový typ, ke kterému mají všechny ostatní typy stejně blízko (či daleko) - pro převod je vhodné použít přetypování int * pi; void *pv = (void*)pi; pi = (int *) pv;

Ukazatel jako parametr funkce - slouží k předání výsledku mimo funkci. Funkce má možnost předat jednu návratovou hodnotu. Další návratové hodnoty je možné předat pomocí ukazatelů v poli parametrů. Ukazatel funkci odkáže na místo, kam má uložit výsledek. -

Napište funkci, která načítá data z klávesnice / souboru a vrací minimální a maximální hodnotu. Návratová hodnota obsahuje počet hodnot, ze kterých byly určeny. //hlavička říká, že předáváme ukazatele/adresy, na kterých jsou hodnoty typu double int MinMax(double *amax, double *amin) {int Minimum, Maximum;... *amax = Maximum; // na předanou adresu se zapíše nalezená hodnota *amin = Minimum; // před přiřazením dojde ke konverzi return Pocet; // vrátí se počet hodnot } volání: double mi, ma; long kolik; kolik = MinMax( &ma, &mi); //ukazatele musí být na stejný typ jako v prototypu fce // návratová hodnota je pro přirazení konvertována nemusí být stejný typ

Ukazatel jako návratová hodnota Který z následujících předávání ukazatele jako návratové hodnoty je možný? A proč? double * Funkce(double hodnota, double adresa*, double *adresa 2) { double vysledek; // možné výsledky return *adresa; return adresa; return hodnota; return &hodnota; return &adresa; return vysledek; return &vysledek; }

double * Funkce(double hodnota, double *adresa, double *adresa2) { double vysledek; // možné výsledky return *adresa; // nesouhlasí typ - double return adresa; //typ souhlasí, adresa je předána z venku ->existuje, může být vrácena return hodnota; // nesouhlasí typ return &hodnota;//nelze předat ven adresu lokální proměnné, která zanikne nakonci return &adresa; // nesouhlasí typ double ** return vysledek; // nesouhlasí typ - double return &vysledek; // nelze předat adresu lokální proměnné }

Napište funkci tak, aby vrátila minimum ze tří hodnot typu int. Zároveň je dán požadavek, aby bylo možné tuto proměnnou nahradit daným čísle tj. aby mohl být nalevo od znaménka rovná se.

int *Min3(int *a1, int *a2, int *a3) // předávají se adresy { if ((*a1 < *a2) && (*a1 < *a3)) // porovnávají se hodnoty return a1; // vrací se ukazatel (adresa) if (*a2 < *a3) return a2; return a3; } volání: int x1=10, x2=20, x3=-10, r; r = *Min3(&x1,&x2,&x3); // předávají se adresy, vrací se adresa. Přístup dereferencí // pomocí dereference se dostaneme k hodnotě na vrácené adrese *Min3(&x2,&x3,&x1) = 10; // parametry jinak umístěny, výsledek musí být stejný // ve funkci Min3 bude ale jiný průběh při krokování // návratovou adresu je možné použít i k zápisu na dané místo r = *Min3(&x1,&x1,&x1); // důležitá ladící dovednost všechny parametry stejné