You are on page 1of 5

Osnovi programiranja dr Boban Stojanovi

1
Pokazivai
U dosadanjem radu smo imali prilike da koristimo promenljive koje smo deklarisali na poetku nekog
bloka. Prilikom deklaracije promenljiva dobija jedinstveni naziv i odgovarajui prostor u memoriji u kome
e biti smetena njena vrednost. Vrednost neke promenljive se moe proitati ili zapisati korienjem
naziva te promenljive. Ovako deklarisane promenljive su vidljive samo u okviru bloka u kome su
deklarisane, a njihov ivotni vek poinje istovremeno sa poetkom izvravanja tog bloka. Nakon zavretka
izvravanja odreenog bloka, sve promenljive deklarisane u njemu se automatski briu iz memorije.
Promenljive deklarisane na ovaj nain esto nazivamo statikim promenljivama, a ovu vrstu
obezbeivanja memorije (alokacija memorije) nazivamo statika alokacija. Nedostatak statikog alociranja
je nemogunost da se za vreme izvravanja programa promeni adresa ili veliina memorijskog prostora koji
je dodeljen promenljivoj. Na primer, prilikom deklarisanja nizova neophodno je da u trenutku pravljenja
programa znate maksimalan broj elemenata, to esto nije sluaj. U realnim problemima najee je
potrebno alocirati memorijski prostor odreene veliine na osnovu informacije koja nije poznata prilikom
pravljenja programa, ve je ona rezultat izvravanja programa. Takav nain alociranja memorije se naziva
dinamiko alociranje. Dinamiko alociranje mogue je ostvariti korienjem posebne vrste promenljivih
koje nazivamo pokazivaima ili pointerima.
Pokazivai i memorija
Memoriju raunara moemo posmatrati kao niz numerisanih (adresiranih) memorijskih elija, kojima se
moe pristupati pojedinano ili u povezanim grupama. Najmanja memorijska jedinica (elija) kojoj se moe
pritupiti je bajt. U zavisnosti od kompajlera jedan bajt memorije je dovoljan za uvanje jednog char
podatka, dva bajta mogu uvati integer, a etiri uzastopna bajta mogu da formiraju real. Slino, za
smetanje pokazivaa se najee koriste grupe od dve ili etiri uzastopne elija (bajta).
Pokaziva (pointer) je promenljiva koja sadri adresu neke druge promenljive. Prilikom programiranja
pokazivai mogu biti veoma moan alat, koji omoguava pisanje kompaktnijeg i efikasnijeg koda.
Meutim, njihovo nepravilno korienje moe ozbiljno naruiti itljivost i funkcionalnost programa.
S obzirom da pokaziva predstavlja adresu odreene promenljive u memoriji, esto kaemo da pokaziva
pokazuje na neku promenljivu. Na sledeoj slici je shematski prikazana situacija u memoriji kada pokaziva
pokazuje na promenljivu tipa char.

Slika ### Pokaziva pokazuje na promenljivu tipa char
Pokazivai u Pascal-u
U programskom jeziku Pascal pokazivae deklariemo na slian nain kao i sve druge promenljive, sa tom
razlikom to ispred tipa promenljive dodajemo i znak ^. Navedeni tip sada oznaava tip podatka na koji
pokaziva pokazuje. Kada jednom deklariemo pokaziva na odreeni tip podatka, ovaj tip vie nije
mogue menjati i pokaziva moe pokazivati samo na promenljive tog tipa.
Sintaksa
type<pokazivacki_tip>=^<tip_podatka_na_koji_pokazuje>;
odnosno
var <pokazivacka_promenljiva>:^<tip_podatka_na_koji_pokazuje>;
Osnovi programiranja dr Boban Stojanovi

2
Primer
typepokazivac=^integer;
knjiga=record
naslov:string[30];
autor:string[20];
broj_strana:integer;
end;
var p:pokazivac;
q:^integer;
pok:^char;
pk:^knjiga;
Da bismo dobili adresu neke promenljive u memoriji, koristimo operator @. Tako linija
p:=@c;
pokazivau p dodeljuje adresu promenljive c i tada kaemo da p pokazuje na c, kao to je prikazano na
Slici ###.

Slika ### Pokaziva ppokazuje na promenljivu c
Ukoliko imamo pokaziva na neku promenljivu, toj promenljivoj moemo pristupiti korienjem operatora
^, koji se jo naziva i operator dereferenciranja. Pretpostavimo da imamo pokaziva p koji pokazuje na
celobrojnu promenljivu a, kao to je prikazano na Slici ###.

Slika ### Pokaziva ppokazuje na celobrojnu promenljivu a
U tom sluaju linija
writeln(p^);
tampa sadraj memorijske lokacije na koju pokazuje p, to je u ovom sluaju broj 5, a linija
p^:=3;
ovoj memorijskoj lokaciji dodeljuje vrednost 3, ime je posredno i promenljiva a dobila vrednost 3.
Pokazivai na slogove se ponaaju na potpuno isti nain kao i pokazivai na proste tipove podataka.
Ukoliko je, na primer, pk pokaziva na slog knjiga iz prethodnog primera, onda bi se konkretnom slogu
pristuplo sa pk^, a lanici sloga sa pk^.naslov.
Na sledeem primeru moemo videti kako se deklariu pokazivai i kako se mogu koristiti operatori @ i ^.
var x,y:integer;
z:array[1..20]ofinteger;
k:knjiga;
p:^integer;/*pjepokazivacnaint*/
pk:^knjiga;
...
x:=5;
y:=1;
p:=@x; /*psadapokazujenax*/
Osnovi programiranja dr Boban Stojanovi

3
y:=p^; /*ysadaimavrednost5*/
p^:=0; /*xsadaimavrednost0*/
p:=@z[5]; /*psadapokazujenaz[5]*/
pk:=@k; /*pksadapokazujenaknjiguk*/
pk^.naslov:='NaDrinicuprija'; /*naslovknjigenakojupokazujepkjeNa...*/
U prethodnom primeru smo videli da se pokaziva p deklarie pomou
var p:^integer;
to bi moglo da se ita kao p pokazuje na integer, ili p^ je integer. Iz ovoga zakljuujemo da se
pokaziva deklarie kao pokaziva na tano odreeni tip podatka i ne moe se koristiti za pokazivanje na
neki drugi tip.
Ukoliko pokaziva pokazuje na celobrojnu promenljivu x, p^ se moe pojaviti u bilo kom kontekstu gde bi
se moglo pojaviti i x. Na primer:
p^:=p^+12;
uveava p^ za 12, a samim tim uveava i x za 12.
Unarni operatori @ i ^ imaju vei prioritet od aritmetikih operatora, tako da
y:=p^+5;
prvo uzima vrednost na koju pokazuje p, uveava je za 5 i dodeljuje promenljivoj y.
S obzirom da su pokazivai promenljive kao i sve druge, mogue je njihovo korienje i bez
dereferenciranja. Jedan od primera je i dodeljivanje vrednosti jednog pokazivaa drugom:
q:=p;
ime se vri kopiranje sadraja pokazivaa p u pokaziva q, tako da sada pokaziva q pokazuje na istu
memorijsku lokaciju, na koju pokazuje i pokaziva p, kao to je prikazano na Slici ###.

Slika ### Dodeljivanje vrednosti pokazivaa ppokazivau q
Za razliku od toga, linija
q^:=p^;
podatku na koji pokazuje pokaziva q dodeljuje vrednost na koju pokazuje pokaziva p, kao na Slici ###.

Slika ### Dodeljivanje vrednosti na koju pokazuje ppodatku na koji pokazuje q.
Osnovi programiranja dr Boban Stojanovi

4
Dinamiko alociranje memorije
U prethodnoj sekciji smo se sretali sa pokazivaima na neke postojee, statiki deklarisane promenljive.
Korienjem ovih pokazivaa posredno je mogue dodeliti ili oitati vrednost promenljivih na koju
pokazivai pokazuju. Meutim, najvea prednost korienja pokazivaa je to to se njima moe dodeliti
odgovarajui memorijski prostor bilo kada tokom izvrenja programa, nezavisno od statiki deklarisanih
promenljivih.
Alociranje novog memorijskog prostora na koji e pokazivati odreeni pokaziva vri se korienjem
naredbe new. Nareba new obezbeuje memorijski prostor ija veliina odgovara tipu podatka na koji
pokaziva naveden unutar naredbe pokazuje. Na primer, ukoliko je pokaziva p deklarisan kao pokaziva na
integer
var p:^integer;
onda e linija
new(p);
obezbediti memorijski prostor za jedan ceo broj, a adresu te memorijske lokacije dodeliti pokazivau p, kao
to je prikazano na Slici ###

Slika ### Dodeljivanje memorijskog prostora korienjem naredbe new
Od tog trenutka pokaziva p pokazuje na celobrojni podatak u memoriji, kome se moe pristupiti
korienjem operatora ^. Na Slici ### dat je grafiki prikaz razliitih operacija nad pokazivaima.

Slika ### ematski prikaz rezultata razliitih operacija nad pokazivaima
Kao to smo ranije pomenuli vrednost na koju pokazuje jedan pokaziva se moe dodeliti podatku na koji
pokazuje drugi pokaziva (Slika ###a). Takoe, pokazivau se moe dodeliti vrednost drugog pokazivaa,
ime se on praktino usmerava da pokazuje na isti podatak kao i drugi pokaziva (Slika ###).
Osnovi programiranja dr Boban Stojanovi

5

Slika ### Dodeljivanje pokazivaa po vrednosti (a) i po adresi (referenci) (b)
Na Slici ###b smo mogli videti da nakon dodeljivanja vrednosti pokazivaa p pokazivau q, ne postoji
pokaziva koji pokazuje na podatak na koji je do tada pokazivao pokaziva q. To znai da od tog trenutka
ne postoji mogunost pristupa toj memorijskoj lokaciji. Iako se taj memorijski prostor vie ne koristi, on
bespotrebno zauzima memoriju. Iz tog razloga potrebno je sve memorijske lokacije koje su zauzete
korienjem naredbe new osloboditi po prestanku potrebe za njima. Oslobaanje zauzete memorije
obavlja se korienjem naredbe dispose:
dispose(q);
Pozivanjem prethodne naredbe oslobaa se memorija na koju je pokazivao pokaziva q, a njegova
vrednost postaje nedefinisana.
Napomenimo i to da pokaziva moe da ne pokazuje ni na jednu memorijsku lokaciju i tada on ima
vrednost NIL. S obzirom da pokaziva sa ovom vrednosu ne pokazuje ni na ta, korienje operatora ^ e
izazvati greku prilikom izvravanja programa.

You might also like