Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilJulie Šmídová
1
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 vytvářet, zpřístup-ňovat a rušit pomocí proměnných datového typu ukazatel Dynamické proměnné nemají vlastní identifi-kátor a přístup k nim se provádí zprostředko-vaně přes hodnotu typu ukazatel 27/06/2018
2
Proměnná p datového typu ukazatel
Dynamické proměnné (2) Proměnná p datového typu ukazatel Dynamická proměnná Proměnná typu ukazatel obsahuje adresu pa-měti, kde se nachází hodnota dynamické pro-měnné Na jednu dynamickou proměnnou může uka-zovat více ukazatelů, pomocí nichž je možné provést její zpřístupnění 27/06/2018
3
Dynamické proměnné (3) Pozor!
definicí proměnné typu ukazatel ještě nevzniká vlastní dynamická proměnná Paměťové místo pro dynamickou proměnnou lze alokovat pomocí funkce malloc Zpřístupnění dynamické proměnné se realizu-je použitím dereferenčního operátoru (*) Uvolnění paměťového místa vymezeného pro dynamickou proměnnou (zrušení dynamické proměnné) se provádí prostřednictvím funkce free 27/06/2018
4
Dynamické proměnné (4) Příklad: int *ptrInt1, *ptrInt2; ptrInt1 = (int *)malloc(sizeof(int)); ptrInt2 = (int *)malloc(sizeof(int)); *ptrInt1 = 0; *ptrInt1 = *ptrInt1+1; scanf(”%d”,ptrInt2); printf(”%d, %d\n”,*ptrInt1,*ptrInt2); free(ptrInt1); free(ptrInt2); 27/06/2018
5
Dynamické datové struktury (1)
Datové struktury, jejichž velikost (počet po-ložek) není známa v době překladu progra-mu Jednotlivé položky těchto struktur mohou vznikat a zanikat během činnosti programu Bývají velmi často realizovány pomocí da-tového typu struct, který obsahuje: část nesoucí vlastní datové informace ukazatel(e), dovolující zpřístupnit další položku (resp. položky) dané struktury 27/06/2018
6
Dynamické datové struktury (2)
Ukazatele v typu struct (pro dynamické datové struktury) typicky obsahují odkaz na právě definovanou strukturu Příklad: typedef struct polozka { int hodnota; struct polozka *dalsi; } typPolozka; typPolozka *dynStrukt; 27/06/2018
7
Dynamické datové struktury (3)
Poznámka: jestliže se struktura odkazuje na sebe samu, pak není možné uvnitř struktury použít identifikátor vytvořený pomocí typedef Proměnná dynStrukt (definovaná jako uka-zatel) může následně sloužit pro zpřístupnění některé z položek celé struktury Pro zpřístupnění ostatních položek lze (opako-vaně) využívat ukazatel dalsi 27/06/2018
8
Dynamické datové struktury (4)
Při práci s ukazateli na typ struktura je možné pro přístup k jednotlivým jejím složkám vy-užít operátor -> Je-li ptrStr ukazatel na strukturu, pak zápis: ptrStr->slozka odkazuje na složku slozka struktury, na níž ukazuje ukazatel ptrStr a je ekvivalentní zápisu: (*ptrStr).slozka 27/06/2018
9
Dynamické datové struktury (5)
Příklad: dynStrukt = (typPolozka *) malloc(sizeof(typPolozka)); dynStrukt->hodnota = 10; /* (*dynStrukt).hodnota = 10; */ Příklady dynamických datových struktur: zásobník (stack) fronta (queue) lineární seznam (linear list) různé typy stromů obecné grafy 27/06/2018
10
Zásobník (1) Dynamická datová struktura typu LIFO (Last In First Out)
Dovoluje přidávat (odebírat) data pouze na jednom svém místě – vrcholu zásobníku 10 vrchol zásobníku 5 20 Po postupném přidání hodnot 100 a 15 bude zásobník vypadat takto: 27/06/2018
11
Zásobník (2) Odebírání hodnot je možné opět pouze z vrcholu zásobníku
15 vrchol zásobníku 100 10 5 20 Odebírání hodnot je možné opět pouze z vrcholu zásobníku Není možné zpřístupnit jinou hodnotu než tu, která je právě na vrcholu zásobníku 27/06/2018
12
Zásobník (3) Se zásobníkem je obecně možné provádět následující operace: init (Z): provede prvotní inicializaci zásobníku Z (před jeho prvním použitím) push (Z, X): uloží hodnotu X na vrchol zásob-níku Z pop (Z, X): odebere hodnotu z vrcholu zásob-níku Z a vloží ji do proměnné X empty (Z): testuje, zda-li je zásobník Z prázdný či nikoliv 27/06/2018
13
Zásobník (4) Implementace zásobníku pomocí dynamických proměnných: typedef struct zasobnik { int hodnota; struct zasobnik *naslednik; } typZasobnik; typZasobnik *z; z hodnota NULL 15 100 10 5 20 naslednik 27/06/2018
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.