op - t08 - pointeri

Download OP - T08 - Pointeri

Post on 10-Oct-2015

11 views

Category:

Documents

0 download

Embed Size (px)

DESCRIPTION

Pointeri u programskom jeziku C

TRANSCRIPT

  • OSNOVOSNOVI I PROGRAMIRANJAPROGRAMIRANJA( VIII )( VIII )

    POINTERIPOINTERI

    mr Draen BraninElektrotehniki fakultet Banja Luka

    2007.

  • 288..11.. DefinicijaDefinicija ppokazivaokazivaaa

    POINTERI?POINTERI?

    PokazivaPokazivai (Pointeri)i (Pointeri)PokazivaPokazivai obezbjeuju indirektan pristup memoriji i obezbjeuju indirektan pristup memoriji (putem adrese)(putem adrese)PokazivaPokaziva je promjenljiva koja sadrje promjenljiva koja sadri memorijsku adresu nekog objektai memorijsku adresu nekog objekta

    ako je u pitanju polje ako je u pitanju polje tada je to adresa potada je to adresa poetnog elementa poljaetnog elementa poljaako je u pitanju funkcija ako je u pitanju funkcija tada je to adresa potada je to adresa poetka funkcijeetka funkcije

    Ako promjenljiva p sadrAko promjenljiva p sadri adresu objekta q, kai adresu objekta q, kaemo da p pokazuje na qemo da p pokazuje na qPrimjer: Primjer:

    MEMORIJA

    adresaadresa1011011001009999

    qq 6565

    Deklaracija pokazivaDeklaracija pokazivaa:a:tip *ime;tip *ime;

    Primjer:Primjer:int *pi;int *pi;char *pc, *tekst;char *pc, *tekst;

    100100pp

  • 388..22.. OperatoriOperatori zaza radrad sasa ppokazivaokazivaiimama

    OPERATORIOPERATORI??

    Operatori za rad sa pokazivaOperatori za rad sa pokazivaimaimaAdresni operatorAdresni operator &&daje adresu nekog objekta u daje adresu nekog objekta u memorijimemorijiAko je q neka promjenljiva tada Ako je q neka promjenljiva tada &q&qdaje adresu te promjenljivedaje adresu te promjenljiveAko Ako elimo da pokazivaelimo da pokaziva p pokazuje p pokazuje na promjenljivu q imamo na promjenljivu q imamo p=&qp=&q

    MEMORIJA

    adresaadresa1011011001009999

    qq 6565

    Operator indirekcijeOperator indirekcije **omoguomoguava indirektan pristup promjenljivoj ava indirektan pristup promjenljivoj koristekoristei pokazivai pokaziva na tu promjenljivuna tu promjenljivuAko je s neka promjenljiva, a p pokazivaAko je s neka promjenljiva, a p pokaziva na na isti tip, tada se moisti tip, tada se moe pisati e pisati s=*ps=*p ..To znaTo znai da i da e q dobiti vrijednost koja se e q dobiti vrijednost koja se nalazi na lokaciji koju pokazuje pnalazi na lokaciji koju pokazuje p

    MEMORIJA

    adresaadresa1011011001009999

    qq 6565

    100100ppp=&qp=&q 100100ppp=&q

    p=&q

    6565sss=*ps=*p

  • 488..22.. OperatoriOperatori zaza radrad sasa ppokazivaokazivaiimama

    OPERATORIOPERATORI??

    Operatori za rad sa pokazivaOperatori za rad sa pokazivaimaimaAdresni operatorAdresni operator & & i i operator indirekcijeoperator indirekcije * * su INVERZNIsu INVERZNI OPERATORIOPERATORI

    y = *& xy = *& x iliili y = xy = xiliili

    int x,y,*z;int x,y,*z;z = &x;z = &x;y = *z;y = *z;

    y = *z = *&x = xy = *z = *&x = x

    PrimjerPrimjer::#include #include main()main(){{

    int x, prom=5, *pokaz;int x, prom=5, *pokaz;pokaz = &prom;pokaz = &prom;x = *pokaz;x = *pokaz;printf(printf(prom=%dprom=%d\\nnx=%dx=%d\\nn,,prom,xprom,x););

    }}

    prom=5x=5

  • 588..33.. PPokazivaokazivaii i i strukturestrukturePOINTER NA POINTER NA

    STRUKTURU?STRUKTURU?

    PokazivaPokazivai na strukturei na struktureNeka imamo strukturuNeka imamo strukturu

    struct datum struct datum { { intint dandan;;intint mjesecmjesec;;intint godinagodina;;

    };};

    Tada moTada moeemo mo dada definidefiniemo:emo:struct datum struct datum rodjen,rodjen, *pokaz *pokaz ;;

    Pokaziva na strukturu datum(jo uvijek ne pokazuje

    nikakav konkretan podatak)

    Ako Ako elimo da elimo da pokazpokaz pokazuje pokazuje rodjenrodjen: : *pokaz = &rodjen ;*pokaz = &rodjen ;

    pokaz sada pokazuje na promjenljivu rodjen (sadri adresu promjenljive rodjen)

  • 688..33.. PPokazivaokazivaii i i strukturestrukturePOINTER NA POINTER NA

    STRUKTURU?STRUKTURU?

    Pristup elementima strukturePristup elementima struktureNeka imamoNeka imamo

    struct datum struct datum { { intint dandan;;intint mjesecmjesec;;intint godinagodina;;

    }} rodjenrodjen, , *pokaz = &rodjen ;*pokaz = &rodjen ;Pristup elementima strukture:Pristup elementima strukture:

    rodjen.dan = 1;rodjen.dan = 1;rodjen.mjesec = 4;rodjen.mjesec = 4;rodjen.godina = 1985;rodjen.godina = 1985;

    Pristup elementima strukture preko pokazivaPristup elementima strukture preko pokazivaa:a:(*pokaz).dan = 1;(*pokaz).dan = 1;(*pokaz).mjesec = 4;(*pokaz).mjesec = 4;(*pokaz).godina = 1985;(*pokaz).godina = 1985;

    iliilipokazpokaz-->dan = 1;>dan = 1;pokazpokaz-->mjesec = 4;>mjesec = 4;pokazpokaz-->godina = 1985;>godina = 1985;

  • 788..33.. PPokazivaokazivaii i i strukturestrukturePOINTER NA POINTER NA

    STRUKTURU?STRUKTURU?

    Pristup elementima strukturePristup elementima strukturePrimjerPrimjer::#include #include main()main(){{

    struct datum struct datum { { intint dandan, , mjesecmjesec, , godinagodina;; }}; ; struct datum r, *p = &r;struct datum r, *p = &r;pp-->dan = 1;>dan = 1;pp-->mjesec = 4;>mjesec = 4;pp-->godina = 1985;>godina = 1985;printf(printf(Datum: %02d.%02d.%d.Datum: %02d.%02d.%d.,, r.dan, r.mjesec, r.godinar.dan, r.mjesec, r.godina););

    }}Datum: 01.04.1985.

  • 888..33.. PPokazivaokazivaii i i strukturestrukturePOINTER U POINTER U

    STRUKTURI?STRUKTURI?

    PokazivaPokaziva u strukturiu strukturi

    x=2 y=5

    PokazivaPokaziva momoe da bude element strukturee da bude element strukturestruct primjer struct primjer { { intint *p1, *p2*p1, *p2;; }} clan;clan;

    Pristup pokazivaPristup pokazivau u strukturiu u strukturi*clan.p1 *clan.p1 odnosnoodnosno *clan.p2*clan.p2

    PrimjerPrimjer::#include #include main()main(){{

    int x,y;int x,y;struct primjer struct primjer { { intint *p1, *p2*p1, *p2;; }};;struct primjer proba, *pok = &proba;struct primjer proba, *pok = &proba;proba.p1 = &x; *proba.p1 = 2;proba.p1 = &x; *proba.p1 = 2;pokpok-->p2 = &y; *pok>p2 = &y; *pok-->p2 = 5;>p2 = 5;printf(printf(x=%d y=%dx=%d y=%d,, x,yx,y););

    }}

  • 988..33.. PPokazivaokazivaii i i strukturestrukturePOVEZANE POVEZANE

    STRUKTURE?STRUKTURE?

    Povezane strukturePovezane struktureKombinovanjem pokazivaKombinovanjem pokazivaa na strukturu i strukture sa pokazivaa na strukturu i strukture sa pokazivaem em momoemo da dobijemo emo da dobijemo strukturu sa pokazivastrukturu sa pokazivaem na istu strukturuem na istu strukturu tj. tj. imamo imamo povezane strukturepovezane strukture

    struct element struct element { { tiptip infoinfo;;struct element *next;struct element *next;

    }} prvi, drugi;prvi, drugi;pokaziva na istu strukturu

    (omoguava povezivanje struktura i pravljenje liste dinamikog niza)

    informaciono polje u strukturi

    prviprviA prvi.next = &drugiprvi.next = &drugi

    prviprvi..infoinfo prviprvi..nextnext

    drugidrugiB

    drugidrugi..infoinfo drugidrugi..nextnext

  • 10

    88..33.. PPokazivaokazivaii i i strukturestrukturePOVEZANE POVEZANE

    STRUKTURE?STRUKTURE?

    Linearna jednostruko povezana listaLinearna jednostruko povezana lista

    00glavaglava

    linklinkinfoinfostruct element struct element { {

    tiptip infoinfo;;struct element *link;struct element *link;

    }} *glava;*glava;

    Linearna dvostruko povezana listaLinearna dvostruko povezana lista

    glavaglava

    DDinfoinfoLL

    reprep00 00

  • 11

    88..33.. PPokazivaokazivaii i i strukturestrukturePOVEZANE POVEZANE

    STRUKTURE?STRUKTURE?

    Binarno stabloBinarno stablovor

    korijenkorijen

    LL DD

    infoinfo

    Lijevo podstablo

    0 0Desno

    podstablo

    0

    0 0 0 0

  • 12

    88..44.. PPokazivaokazivaii i i poljapolja

    POINTER NA POINTER NA POLJEPOLJE??

    PokazivaPokaziva na vektor (jednodimenzionalno polje)na vektor (jednodimenzionalno polje)Ime vektora (niza) predstavlja adresu poIme vektora (niza) predstavlja adresu poetnog elementa vektora i veetnog elementa vektora i ve je je samo po sebi pokazivasamo po sebi pokaziva (stati(statiki pokazivaki pokaziva))

    a[2]a[0] a[1]00 0 0

    a[3]0a[4]

    intint aa[5][5]=={0};{0};intint *p, *q; *p, *q;

    p = a;p = a;iliili

    p = &a[0];p = &a[0];q = a+3;q = a+3;

    iliiliq = &a[3];q = &a[3];

    Napomena:a je statika promjenljivaNije dozvoljeno a=a+2; ili a++;

    Napomena:p je dinamika promjenljivaDozvoljeno je p=p+2; ili p++;

  • 13

    88..44.. PPokazivaokazivaii i i poljapolja

    POINTER NA POINTER NA POLJEPOLJE??

    PokazivaPokaziva na vektor (jednodimenzionalno polje)na vektor (jednodimenzionalno polje)PrimjerPrimjer::#include #include static int xstatic int x[5] = {1,2,3,4,5};[5] = {1,2,3,4,5};main()main(){{

    int int *p*p;;p = x;p = x;printf(printf(%d %d%d %d %%dd\\nn,, x[0], x[1], x[2]);x[0], x[1], x[2]);printf(printf(%d %d%d %d %%dd\\nn,, *p, *(p+1), *(p+2) );*p, *(p+1), *(p+2) );

    }}

    1 2 31 2 3

  • 14

    88..44.. PPokazivaokazivaii i i poljapolja

    POINTER NA POINTER NA POLJEPOLJE??

    PrenosPrenos vektoravektora u u funkcijufunkciju ppoomomou pokazivau pokazivaaaPretpostavimo da imamo funkcijuPretpostavimo da imamo funkciju

    int funkcija (niz, n)int funkcija (niz, n)int nizint niz[], n;[], n;{ ... }{ ... }

    pristup elementima u nizuniz[indeks]

    int funkcija (int funkcija (pp, n), n)int int *p, n;*p, n;{ ... }{ ... }

    pristup pomou pointera*(p+indeks)

    iliili

    PrimjerPrimjer::int suma (int suma (intint nizniz[][], , intint n)n)

    {{int int s=0, is=0, i;;for (i=0; i

  • 15

    88..44.. PPokazivaokazivaii i i poljapolja

    POINTER NA POINTER N