Pokazivači, algoritmi - unidu.hr · PDF fileint varijabla; int *pokazivac; deklaracija obične varijable deklaracija pokazivača. 2011/2012 Pokazivači, algoritmi 4 Tipovi pokazivača

Embed Size (px)

Citation preview

  • PokazivaPokazivai, algoritmii, algoritmi

    Tomo SjekavicaTomo Sjekavica

    OOujak 2012.ujak 2012.

    Zatieno licencom http://creativecommons.org/licenses/by-nc-sa/3.0/hr/

    http://creativecommons.org/licenses/by-nc-sa/3.0/hr/

  • 2011/2012 Pokazivai, algoritmi 2

    Creative CommonsCreative Commonso slobodno smijete:

    n dijeliti umnoumnoavati, distribuirati i javnosti priopavati, distribuirati i javnosti priopavati djelo avati djelo n remiksirati preraivati djelo preraivati djelo

    o pod slijedeim uvjetima:n imenovanje. Morate priznati i ozna. Morate priznati i oznaiti autorstvo djela na iti autorstvo djela na

    nanain kako je specificirao autor ili davatelj licence (ali ne in kako je specificirao autor ili davatelj licence (ali ne nanain koji bi sugerirao da Vi ili Vain koji bi sugerirao da Vi ili Vae korie koritenje njegova djela tenje njegova djela imate njegovu izravnu podrimate njegovu izravnu podrku). ku).

    n nekomercijalno. Ovo djelo ne smijete koristiti u . Ovo djelo ne smijete koristiti u komercijalne svrhe. komercijalne svrhe.

    n dijeli pod istim uvjetima. Ako ovo djelo izmijenite, . Ako ovo djelo izmijenite, preoblikujete ili stvarate koristepreoblikujete ili stvarate koristei ga, preradu moi ga, preradu moete ete distribuirati samo pod licencom koja je ista ili slidistribuirati samo pod licencom koja je ista ili slina ovoj.na ovoj.

    U sluaju daljnjeg koritenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji nain da to uinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta mogue je odstupiti, ako dobijete doputenje nositelja autorskog prava. Nita u ovoj licenci ne naruava ili ograniava autorova moralna prava.

    Tekst licence preuzet je s http://creativecommons.org/.

    http://creativecommons.org/

  • 2011/2012 Pokazivai, algoritmi 3

    Pokazivaio pokazivai su varijable koje sadre adresu neke

    druge varijable

    o pokaziva se oznaava sa znakom zvjezdice *ispred naziva pokazivaa

    o pokazivai se najee koriste kod predaje polja funkciji kao ulazni parametar, kod koritenja raznih struktura, kod dinamike alokacije memorije, te kod rada sa datotekama

    int varijabla; int *pokazivac;

    deklaracija obine varijable deklaracija pokazivaa

  • 2011/2012 Pokazivai, algoritmi 4

    Tipovi pokazivaa

    o vrijednost pokazivaa e uvijek biti neki cijeli broj bez obzira na koji tip varijable pokazuje jer se u njega sprema adresa te varijable

    o pokazivai mogu pokazivati samo na varijable koje su istog tipa kao i tip podatka s kojim je deklariran i pokaziva

    char *p; moe pokazivati samo na char varijablu

    moe pokazivati samo na int varijabluint *p;

    float *p;

    double *p;

    moe pokazivati samo na float varijablu

    moe pokazivati samo na double varijablu

    char a;

    int a;

    float a;

    double a;

  • 2011/2012 Pokazivai, algoritmi 5

    Primjer s pokazivaima#include int main(){

    int *p;int a = 5;printf("a = %d.\n", a);p = &a;*p = 10;printf("a = %d.\n", a);printf("*p = %d.\n", *p);printf("p = %d.\n", p);printf("&p = %d.\n", &p);system("pause");return 0;

    }pokazivaci01.c

    Hmm, to e mi ispisati ovaj program?

    poetak

    deklaracija pokazivaa p

    deklaracija varijable a i priruivanje vrijednosti

    5 varijabli a

    pridruivanje adrese varijable a

    pokazivau p

    promjena vrijednosti na koju pokazuje pokaziva

    p na vrijednost 10

    ispisi varijable a, vrijednosti i adrese na

    koju pokazuje pokazivap, te njegove adrese

    kraj

  • 2011/2012 Pokazivai, algoritmi 6

    Anatomija C programa#include int main(){

    int *p;int a = 5;printf("a = %d.\n", a);p = &a;*p = 10;printf("a = %d.\n", a);printf("*p = %d.\n", *p);printf("p = %d.\n", p);printf("&p = %d.\n", &p);system("pause");return 0;

    }

    2359130

    2359131

    2359132

    2359133

    ...

    2359129

    2359128

    2359127

    2359126

    2359125

    2359124

    2359123

    2359122

    2359121

    2359120

    2359119

    ...deklaracija pokazivaa koji e pokazivati na cjelobrojnu vrijednost

    deklaracija cjelobrojne varijable a i pridruivanje vrijednosti varijabli a

    5postavljanje da pokaziva pokazuje na varijablu a

    2359124

    mijenjanje vrijednosti varijable a pomou pokazivaa 10

    p

    a X

  • 2011/2012 Pokazivai, algoritmi 7

    Inicijalizacija pokazivaa

    o prije koritenja pokazivaa obavezno je inicijalizirati pokaziva, tj. postaviti da pokazuje na neku adresu

    o u sluaju da se ne zna adresu na koju treba pokazivati pokaziva treba ga incijalizirati sa NULL

    int *p;int a = 5;p = &a;

    nakon deklaracije pokazivaa i varijable potrebno je pokaziva inicijalizirati

    A to ako trenutno ne znam na koju adresu da mi

    pokazuje, a ne elim ga izbrisati jer e mi

    trebati kasnije u programu?

    int *p;p = NULL;

  • 2011/2012 Pokazivai, algoritmi 8

    int *p;int a = 5;p = &a;printf("%d %d", a, *p);*p = 10;printf("%d %d", a, *p);

    Operator dereferenciranja *

    o nakon inicijalizacije pokazivaa vrijednosti te varijable se moe pristupiti preko pokazivaa

    5 5

    Uili smo se da se znak zvjezdice * koristi za

    mnoenje. Kako se sada isti koristi i kod pokazivaa?

    Kod pokazivaa se *koristi kao unarni operator

    dereferenciranja!

    10 10

  • 2011/2012 Pokazivai, algoritmi 9

    Zamjena vrijednosti varijabli v0.1#include int main(){

    int a = 5;int b = 7;int pom;printf("Prije zamjene:\n");printf("a = %d, b= %.d\n", a, b);pom = a;a = b;b = pom;printf("Nakon zamjene:\n");printf("a = %d, b= %.d\n", a, b);return 0;

    }zamjena01.c

  • 2011/2012 Pokazivai, algoritmi 10

    Anatomija C programa#include int main(){

    int a = 5;int b = 7;int pom;printf("Prije zamjene:\n");printf("a = %d, b= %.d\n", a, b);pom = a;a = b;b = pom;printf("Nakon zamjene:\n");printf("a = %d, b= %.d\n", a, b);return 0;

    }

    2359126

    2359127

    2359128

    2359129

    ...

    2359125

    2359124

    2359123

    2359122

    2359121

    2359120

    2359119

    2359118

    2359117

    2359116

    2359115

    ...

    7

    5

    5

    deklaracija cjelobrojne varijable a i pridruivanje vrijednosti varijabli

    deklaracija cjelobrojne varijable b i pridruivanje vrijednosti varijabli

    deklaracija cjelobrojne pomone varijable

    spremanje vrijednosti varijable a u varijablu pom

    spremanje vrijednosti varijable b u varijablu a

    spremanje vrijednosti varijable pom u varijablu b7

    5

    pom

    b

    a

    Nakon zamjene:a = 7, b = 5.

    X

    X

  • 2011/2012 Pokazivai, algoritmi 11

    Zamjena vrijednosti v0.2 (s funkcijom)#include void zamjena(int x, int y){

    int pom;pom = x;x = y;y = pom;printf("U funkciji, nakon zamjene:\n");printf("x = %d, y = %d.\n", x, y);

    }int main(){

    int a = 5;int b = 7;printf("Prije pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);zamjena(a, b);printf("Nakon pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);return 0;

    } zamjena02.c

  • 2011/2012 Pokazivai, algoritmi 12

    Anatomija C programa#include void zamjena(int x, int y){

    int pom;pom = x;x = y;y = pom;printf("U funkciji, nakon zamjene:\n");printf("x = %d, y = %d.\n", x, y);

    }int main(){

    int a = 5;int b = 7;printf("Prije pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);zamjena(a, b);printf("Nakon pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);return 0;

    }

    2359120

    2359122

    2359124

    2359126

    ...

    ...

    2359094

    2359092

    2359090

    2359088

    2359086

    2359084

    2359082

    2359080

    2359078

    2359076

    ...

    deklaracija varijable a i pridruivanje vrijednosti

    deklaracija varijable b i pridruivanje vrijednosti

    5a

    7bpoziv funkcije zamjena

    1. parametru funkcije x se predaje vrijednost varijable a

    2. parametru funkcije y se predaje vrijednost varijable b

    5x

    spremanje vrijednosti varijable x u varijablu pom

    spremanje vrijednosti varijable y u varijablu x

    spremanje vrijednosti varijable pom u varijablu ydeklaracijapomonevarijable

    5pom

    7y

    7

    5

    Nakon pozivanja funkcije:a = 5, b = 7.

    X

    X

  • 2011/2012 Pokazivai, algoritmi 13

    Pokazivai kao parametri funkcije

    o Izmijenite prethodnu funkciju tako da su ulazni parametri pokazivai koji pokazuju na realni broj, a ne obine varijable

    o U glavnom programu se trebaju unositi dva realna broja s tipkovnice umjesto pridruivanja vrijednosti varijablama

    Brojeve prikazati na 2 decimale.

    to trebam predatifunkciji iji su parametripokazivai? Vrijednost

    varijable ili njenu adresu?

  • 2011/2012 Pokazivai, algoritmi 14

    Aritmetika pokazivaato emo dobiti s prvim izrazom *p = *p * 10;?*p = *p * 10;

    Prvi izraz e poveativrijednost varijable na koju pokazuje pokaziva

    p za 10 puta!

    p = p + 1;

    Drugi izraz e poveatiadresu na koju pokazuje pokaziva p, tako da sad

    pokaziva p pokazujena sljedeu adresu!

    A to emo dobiti sovim drugim izrazom

    p = p + 1;?

    o ovisno o tipu pokazivaa vrijednost adrese na koju pokazuje e se poveati za 1, 4 ili 8.

    o unarni operator dereferenciranja * ima vei prioritete od svih matematikih i logikih operacija

    int, float doublechar

  • 2011/2012 Pokazivai, algoritmi 15

    Pokazivai i polja

    o pristup elementima polja

    Hmm, mogu li aritmetiku pokazivaa primjeniti

    na polja?

    Naravno, kad se kreira polje svi njegovi elementi

    se spremaju jedan iza dru