A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze 2009.01.

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
Pro začátek něco lehčího
Orbis pictus 21. století Tato prezentace byla vytvořena v rámci projektu.
Programování v C jazyku - SEMINÁŘ
Počítače a programování 1 Přednáška 13 Jiří Šebesta.
Programování funkcí v Excelu (pole)
Programovací jazyk C++
Přednáška 11 Jiří Šebesta
Standardní knihovní funkce: matematika a datum a čas
Základní pojmy v jazyce C
Programování 2 Cvičení 5.
Pole, ukazatele a odkazy
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Strukturované datové typy
Preprocess Úvod do tvorby funkcí Princip preprocesoringu Direktivy preprocesoru Podmíněný překlad Základy tvorby funkcí Zjednodušený popis principu předávaní.
Cvičení 2 Proměnné(jednoduché a složené) a konstanty První program Zápis výrazů.
Programování v C++ Cvičení.
Algoritmizace a programování
Operátory (1. část) 3 A1PRG - Programování – Seminář
Datové typy 6 A1PRG - Programování – Seminář
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro práci se soubory 13 Verze
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.
Jednoduché datové typy
A1PRG - Programování – Seminář Ing. Michal Operátory (2. část) 4 Verze
Seminář C cvičení STL, Trolltech Ing. Jan Mikulka.
Seminář C cvičení Obsluha výjimek Ing. Jan Mikulka.
Současný svět Projekt č. CZ /3. 1
Cvičení.
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í.
Datové typy a struktury
Příklady v jazyku C – část 3
Odkaz (reference)‏ Skalární proměnná, která obsahuje adresu jiné proměnné Adresa je místo v paměti počítače, kam se ukládají data. Odkaz je skalární proměnná,
A1PRG - Programování – Seminář Ing. Michal Standardní knihovní funkce pro vstup a výstup 12 Verze
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ý.
Realloc a qsort examples BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky © Miroslav Balík Fakulta informačních technologií České vysoké.
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é.
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.
C – jak na procedury Mgr. Lenka Švancarová. C – procedury #include int main() { printf("Ahoj\n"); return(0); } #include void pozdrav(void) { printf("Ahoj\n");
Příklady v jazyku C – část 8. Napište program, který inicializuje 2-rozměrné pole uživatele (5 řádků, 2 sloupce) a naplní ho hodnotami (první sloupec.
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.
C – procedury Mgr. Lenka Švancarová.
C – if Mgr. Lenka Švancarová. if vývojový diagram Podmínka Příkaz(y) Podmínka Příkaz(y) Úplné větveníNeúplné větvení ++--
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é.
Funkce, intuitivní chápání složitosti
Pokročilé datové typy (struktury, unie, dynamické proměnné)
Funkce Přednáška č. 5. Funkce (functions)  posloupnost příkazů uvedená hlavičkou  využití – opakovaně volaná sekvence – strukturování programu – ošetření.
Programování OPERÁTOR SIZEOF, FUNKCE, POLE JAKO PARAMETRY FUNKCÍ ERIK KRÁL.
Řetězce v jazyce C ● řetězec je posloupnost znaků ● řetězcové konstanty se v C vkládají mezi uvozovky, např. "Ahoj Hugo!" ● v paměti je řetězec uložen.
Alokace paměti v C++ Funkce v C++ a parametry typu reference, implicitní parametry funkcí.
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é.
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é.
Vzorové řešení zápočtového testu
Programovací jazyk C Autorem materiálu a všech jeho částí, není-li uvedeno jinak, je Ing. Jitka Vlčková. Dostupné z Metodického portálu ISSN.
Programování v jazyce C++
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.
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.
Řetězce (1) Řetězec (string) je posloupnost znaků (hod-not typu char)
Transkript prezentace:

A1PRG - Programování – Seminář Ing. Michal Ukazatele a pole 10 Verze

Agenda  Ukazatele  Nulový ukazatel  Obecný ukazatel  Aritmetika ukazatelů  Dynamické přidělování paměti

Ukazatel  Při dosavadní práci s proměnnými použity tzv. statické proměnné.  Ukazatel (Pointer) je proměnná, která představuje adresu v paměti, na které je uložena skutečná hodnota.

Ukazatel  Ukazatel je proměnná  Neobsahuje hodnotu, ale pouze paměťovou adresu  Zajímá nás hodnota ležící na adrese, kterou definuje  Každý ukazatel ukazuje na určitý datový typ (ukazatel na celé číslo, …)

Ukazatel  Pojmy:  Adresa ukazatele  Obsah ukazatele / Hodnota ukazatele  Hodnota na níž ukazatel ukazuje

Operátory  Operátor reference  Operátor:&  Význam:Vrací adresu proměnné  Operátor dereference  Operátor:*  Význam:Vrací obsah zadané adresy

Příklad 1 PříkazObsah na adrese 10 (&i)20 (&p_i1)30 (&p_i2) i = 1; 1?? p_i1 = &i; 110? *p_i1 = 2; 210? i = *p_i1 + 1; 310? p_i2 = &p_i1; int i; int *p_i1; int *p_i2;

Příklad 2  #include "stdafx.h"  #include  int _tmain(int argc, _TCHAR* argv[])  {  int i, j, *p_i;  scanf("%d %d",&i,&j);  p_i = (i > j) ? &i : &j;  printf("Vetsi je %d na adrese %p",*p_i,p_i);  getch();  return 0;  }

Nulový ukazatel  Symbolická konstanta NULL  Lze přiřadit libovolnému ukazateli bez ohledu na datový typ  Označení, že ukazatel „neukazuje nikam“

Nulový ukazatel  Příklad:  Otevření neexistujícího souboru (v případě, že soubor neexistuje, vrací funkce hodnotu NULL): FILE *f; f = fopen(″soubor.txt″,″r″); if (f == NULL) printf(″Soubor neexistuje″);

Obecný ukazatel  Generický ukazatel na typ void  Po správném přetypování může ukazovat na data libovolného typu

Obecný ukazatel void *p; int a = 5; double b = 2.8e36; p = &a; * (int *) p = 7; p = &b; * (double *) p = 12.83;

Příklad  Funkce pro záměnu dvou proměnných void zamen(int *p_i, int *p_j) { int pom; pom = *p_i; *p_i = *p_j; *p_j = pom; }

Aritmetika ukazatelů  Součet (a rozdíl) ukazatele a celého čísla  Rozdíl ukazatelů  Porovnání ukazatelů

Aritmetika ukazatelů  Součet (a rozdíl) ukazatele a celého čísla:  Přičtením celého čísla k ukazateli vzniká ukazatel nový.  Nový ukazatel bude ukazovat o N adres dále.  Pokud ukazatel bude ukazovat na prvek struktury, která v paměti zabírá 10 B, přičtením 1 bude nový ukazatel ukazovat o 10 B dále.  Př. int *p_i; p_i = p_i + 1;

Aritmetika ukazatelů  Rozdíl ukazatelů:  Vrací počet údajů, které leží mezi prvním a druhým ukazatelem.  Rozdíl ukazatelů má smysl například u polí  Porovnání ukazatelů (==):  Vrací hodnotu 1, pokud ukazatele ukazují na stejné místo v paměti.  U polí možno použít i další relační operátory.

Dynamické přidělování paměti  Umožňuje uživateli řídit přidělování paměti  Paměť je přidělována z tzv. hromady (heap)  Problém: přidělování paměti tak, aby nedošlo ke kolizi s ostatními daty.  Přidělení paměti pomocí funkce malloc().  Uvolnění paměti pomocí funkce free().

Dynamické přidělování paměti  Funkce malloc()  Rezervace paměti  Jediný parametr typu unsigned int – počet bytů  Návratová hodnota: ukazatel na typ void – obsahuje adresu prvního prvku v paměti Je vhodné přetypovat na potřebný datový typ Není-li v paměti dostatek místa pro přidělení žádaného úseku, vrací hodnotu NULL

Dynamické přidělování paměti  Funkce free()  Uvolnění paměti  Parametrem je ukazatel na typ void

Dynamické přidělování paměti  Příklad: int *p_i; if ((p_i = (int *)malloc(sizeof(int))) == NULL) { printf("Nedostatek pameti!"); }else{ printf("Zadejte celociselnou hodnotu: "); scanf("%d", p_i); printf("Zadana hodnota: %d",*p_i); free(p_i); }

Dynamické přidělování paměti  Funkce calloc()  Alokace paměti pro určitý počet prvků dané velikosti  Parametry: Počet prvků Velikost jednoho prvku - počet bytů  Návratová hodnota: ukazatel na typ void – obsahuje adresu prvního prvku v paměti

Dynamické přidělování paměti  Funkce calloc()  Srovnání s funkcí malloc() malloc ( n * size ); calloc ( n, size );

Pole  „Struktura“ složená se stejných prvků  Jednotlivé prvky indexujeme od 0 Př.: int x[10]; x[0] = 10; for (int i = 0; i < 10; i++) { x[i] = i; }

Statické pole  Nevýhoda: nutno zadat konstantní rozměr pole Př.: int x[10]; x[0] = 10; for (int i = 0; i < 10; i++) { x[i] = i; }

Dynamické pole  Možnost zadat rozměr pole na základě proměnné.  Definice pomocí malloc() (popř. calloc()) Př.: int *x; x = (int *) malloc(10*sizeof(int)); for (int i = 0; i < 10; i++) { *(x+i) = i; }

Statické / dynamické pole AkceStatické poleDynamické pole Definice int x[5];int *x; x = malloc(5*sizeof(int)) Naplnění n-tého prvku pole hodnotou x[n] = 5;*(x + n) = 5; Adresa n-tého prvku (např. u příkazu scanf) scanf("%d",&x[n]);scanf("%d",(x+n)); Uvolnění paměti free(x)

Vícerozměrná pole  Jazyk C umožňuje definici pole s vyšší dimenzí než 1.  Dvourozměrné pole: int x[10][10]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { x[i][j] = 0; }

Vícerozměrná pole  Trojrozměrné pole: int x[10][10][10]; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k < 10; k++) { x[i][j][k] = 0; }

Vícerozměrná pole  Statické pole int pole[2][2];  Po celou dobu má rozměr 2x2  Polostatické pole int *pole[2]; pole[0] = (int *)malloc(4*sizeof(int)); pole[1] = (int *)malloc(8*sizeof(int));  Počet řádků neměnná, každý řádek má různý počet prvků

Vícerozměrná pole  Dynamické pole int **pole; pole = (int **) malloc(2*sizeof(int *)); pole[0] = (int *)malloc(4*sizeof(int)); pole[1] = (int *)malloc(8*sizeof(int));  Zcela flexibilní

Vícerozměrná pole  Transformace dvourozměrného pole na jednorozměrné int *pole; int r = 3; int s = 2; pole = (int *)malloc(r*s*sizeof(int)); //přístup k pole[2][1] *(pole + (2*s + 1)) = 5;

Inicializace pole  Hodnoty uvádíme ve složených závorkách int x[3] = {2, 3, 5}; int y[] = {1, 2};  Pokud v inicializaci uvedeme méně prvků, zbylé jsou inicializovány na 0 int x[3] = {2, 3};  Na druhou stranu není možné uvést prvků více: int y[2] = {1, 2, 4};

Inicializace pole  Vícerozměrné pole int x[][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

A1PRG-s10. Ukazatele a pole Děkuji za pozornost Ing. Michal Heczko 218/U3 Prezentace k dispozici na