OP - T08 - Pointeri

Download OP - T08 - Pointeri

Post on 10-Oct-2015

9 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 NA POLJEPOLJE??

    PokazivaPokaziva na na matricumatricu ((dvdvodimenzionalno polje)odimenzionalno polje)...0 1 j ... m-1

    01

    i

    n-1

    mat[i][j]

    mat[0][0]

    intint *p; *p;

    p = mat;p = mat;iliili

    p = &mat[0][0];p = &mat[0][0];*( mat + m*i + j )*( mat + m*i + j )

    iliili*( &mat[0][0] + m*i + j )*( &mat[0][0] + m*i + j )

  • 16

    88..55.. AdresnaAdresna aritmetikaaritmetikaADRESNA ADRESNA

    ARITMETIKAARITMETIKA??

    AdresnaAdresna aritmetikaaritmetikaNekaNeka jeje::

    a a vektorvektor sasa elementimaelementima tipatipa TTv v izrazizraz tipatipa TTn n cjelobrojnicjelobrojni izrazizrazp, p, qq pokazivapokazivai na tip T (pokazuju na elemente niza a)i na tip T (pokazuju na elemente niza a)

    Tada vaTada vae sljedee sljedea pravila:a pravila:a a pokazivapokaziva na pona poetak nizaetak niza&a&a[0] [0] pokapokazzivaiva nana popoetak nizaetak niza*p *p element niza a na koji pokazuje pelement niza a na koji pokazuje p*p=v *p=v elementu na koji pokazuje p dodjeljuje vrijednost velementu na koji pokazuje p dodjeljuje vrijednost v++p ++p pokazuje na sljedepokazuje na sljedei element nizai element niza----p p pokazuje na prethodni element nizapokazuje na prethodni element niza*++p *++p inkrementira p, pa pristupa tom (sljedeinkrementira p, pa pristupa tom (sljedeem) elementuem) elementu*p++ *p++ -- pristupa elementu na koji pokazuje p, a zatim pokazujepristupa elementu na koji pokazuje p, a zatim pokazuje

    na sljedena sljedei elementi elementp+n p+n -- pokazuje na npokazuje na n--ti naredni element nizati naredni element niza*(p+n)=v *(p+n)=v dodjeljuje vrijednost v ndodjeljuje vrijednost v n--tom narednom elementu u nizu utom narednom elementu u nizu u

    odnosu na element na koji pokazuje podnosu na element na koji pokazuje pqq--p p -- odreuje broj elemenata niza smje odreuje broj elemenata niza smjetenih izmeu adresa natenih izmeu adresa na

    koje pokazuju q i pkoje pokazuju q i p

  • 17

    88..55.. AdresnaAdresna aritmetikaaritmetikaADRESNA ADRESNA

    ARITMETIKAARITMETIKA??

    PrimjerPrimjer::#include #include main()main(){{static char cstatic char c[] = {[] = {aa,,bb,,cc,,dd};};static static intint i[] = { 1, 2, 3, 4};i[] = { 1, 2, 3, 4};charchar *pc1=&c[0], *pc2=&c[3]*pc1=&c[0], *pc2=&c[3];;intint *pi1=&i[0], *pi2=&i[3];*pi1=&i[0], *pi2=&i[3];printf(printf(*c=*c=%%cc *i=*i=%d%d\\nn,, *c, *i);*c, *i);printf(printf(*pc1=*pc1=%%cc *pi1=*pi1=%d%d\\nn,, *pc1, *pi1);*pc1, *pi1);printf(printf(*(pc1+1)=*(pc1+1)=%%cc *(pi1+2)=*(pi1+2)=%d%d\\nn,, *(pc1+1), *(pi1+2));*(pc1+1), *(pi1+2));printf(printf(*++pc1=*++pc1=%%cc *++pi1=*++pi1=%d%d\\nn,, *++pc1, *++pi1);*++pc1, *++pi1);printf(printf(*pc1++=*pc1++=%%cc *pi1++=*pi1++=%d%d\\nn,, *pc1++, *pi1++);*pc1++, *pi1++);printf(printf(*pc1=*pc1=%%cc *pi1=*pi1=%d%d\\nn,, *pc1, *pi1);*pc1, *pi1);pc1pc1--=2; pi1=2; pi1--=2;=2;printf(printf(*pc1=*pc1=%%cc *pi1=*pi1=%d%d\\nn,, *pc1, *pi1);*pc1, *pi1);printf(printf(pc2pc2--pc1=%dpc1=%d pi2pi2--pi1=pi1=%d%d\\nn,, pc2pc2--pc1, pi2pc1, pi2--pi1);pi1);

    }}

    *c=a *i=1*pc1=a *pi1=1*(pc1+1)=b *(pi1+2)=3*++pc1=b *++pi1=2*pc1++=b *pi1++=2*pc1=c *pi1=3*pc1=a *pi1=1pc2-pc1=3 pi2-pi1=3

  • 18

    88..66.. PrenosPrenos argumenataargumenata referisanjemreferisanjem

    REFERISANJEREFERISANJE??

    PrenosPrenos argumenataargumenata u u funkcijufunkciju referisanjemreferisanjemArgumentiArgumenti se u se u funkcijufunkciju standardnostandardno prenoseprenose putemputem vrijednostivrijednosti

    Funkcija nema moguFunkcija nema mogunost da promijeni vrijednost stvarnog argumenta!!!nost da promijeni vrijednost stvarnog argumenta!!!

    Da bi se omoguDa bi se omoguilo da funkcija mijenja vrijednost stvarnog argumenta:ilo da funkcija mijenja vrijednost stvarnog argumenta:1. Prilikom poziva funkcije treba slati adresu!1. Prilikom poziva funkcije treba slati adresu!2. Formalni argument treba definisati kao pokaziva2. Formalni argument treba definisati kao pokaziva na tip!na tip!3. U tijelu funkcije treba koristiti operator indirekcije!3. U tijelu funkcije treba koristiti operator indirekcije!

    REFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumentaREFERISANJE = PRENOS ADRESE (REFERENCE) stvarnog argumentaReferisanje omoguReferisanje omoguava da funkcija mijenja vrijednost stvarnog argumenta!ava da funkcija mijenja vrijednost stvarnog argumenta!

  • 19

    88..66.. PrenosPrenos argumenataargumenata referisanjemreferisanjem

    REFERISANJE?REFERISANJE?

    PrimjerPrimjer::#include #include void suma ( niz, n, s )void suma ( niz, n, s )

    int *niz, n, *s;int *niz, n, *s;{{

    int i;int i;*s = 0; *s = 0; for (i=0; i

  • 20

    88..77.. DinamiDinamika alokacija memorijeka alokacija memorije

    DinamiDinamika alokacija?ka alokacija?

    StatiStatika i dinamika i dinamika alokacija memorijeka alokacija memorijeStatiStatika alokacija memorijeka alokacija memorije

    karakteristikarakteristino za polja (nizovi, matrice, ...)no za polja (nizovi, matrice, ...)prednost: prednost:

    memorija se jednostavnije alocira i oslobaa memorija se jednostavnije alocira i oslobaa (za programera)(za programera)osnovni nedostaci: osnovni nedostaci:

    ograniograniene moguene mogunosti alokacijenosti alokacijeunaprijed treba znati maksimalan broj podatakaunaprijed treba znati maksimalan broj podataka

    DinamiDinamika alokacija memorijeka alokacija memorije

    karakteristikarakteristino za dinamino za dinamike strukture podataka (liste, stabla, ...)ke strukture podataka (liste, stabla, ...)prednost: prednost:

    fleksibilnost u pogledu zauzefleksibilnost u pogledu zauzea memorije (alokacija po potrebi)a memorije (alokacija po potrebi)osnovni nedostaci: osnovni nedostaci:

    zahtijeva se eksplicitna alokacija i oslobaanje memorijezahtijeva se eksplicitna alokacija i oslobaanje memorije

  • 21

    88..77.. DinamiDinamika alokacija memorijeka alokacija memorije

    DinamiDinamika alokacija?ka alokacija?

    FFunkcijunkcije za dinamie za dinamiku alokaciju memorijeku alokaciju memorijevoidvoid *malloc(size)*malloc(size)

    rezervirezervie memorijski blok potrebne velie memorijski blok potrebne veliine (size bajtova)ine (size bajtova)ako je alokacija uspjeako je alokacija uspjena vrana vraa pokazivaa pokaziva na na voidvoid, ina, inae vrae vraa...