Stojis na Slaviji i cekas bus. Prilazi ti covek i pita gde je palata 'Beogradjanka'.
Za odgovor imas tri opcije:
1) uperis prst (pointer, pokazivac) u pravcu palate i kazes 'eno je tamo'
2) uhvatis coveka za ruku i odvedes ga do palate i kazes 'evo ovde' a zatim se vratis da cekas bus
3) kazes coveku da saceka, odes do palate, natovaris je na ledja, doneses je do coveka i kazes - evo je, zasta ti je trebala ?
Salu na stranu, pointeri/pokazivaci postoje odkada i programski jezici, a poticu od same fizike memorijskih cipova koji identifikuju
pojedine memorijske lokacije pomocu njihovih
adresa. Cinjenica je da kompajler sa svakom promenljivom (bez obzira kako je
i gde ti deklarisao) operise preko njene adrese. Deklarisanje promenljive (napr: int x; float y; ) je samo olaksica za programera, i u
nekim jezicima programer ne mora ni da zna adresu promenljive.
Evo nekih primera gde upotreba pointera ima smisla:
Primer 1:
Ako treba dugacak niz memorijskih lokacija da obradis na isti nacin (recimo memorijski prostor od 2MB koji sadrzi piksele neke slike)
primitivan nacin bi bio ovo (pisano u izmisljenom pseudokodu):
Code:
uradi nesto sa memorijskom lokacijom na adresi 0x00000000;
uradi nesto sa memorijskom lokacijom na adresi 0x00000001;
....
....
uradi nesto sa memorijskom lokacijom na adresi 0x001FFFFF;
Ovo zahteva 2 miliona individualnih instrukcija, sedam sati provedenih za tastaturom da bi ukucao program uz enormnu priliku
da se nesto pogresno ukuca, i ocito je vrlo glupo i neefikasno u svakom pogledu.
Ako se dosetis pa rezervises jednu memorijsku lokaciju da sadrzi adrese (sto je pointer po definiciji), onda sve mozes da uprostis
(opet pisano u pseudo kodu):
Code:
addr = 0x00000000;
petlja:
uradi nesto sa memorijskom lokacijom na adresi sadrzanoj u addr;
inkrementiraj addr (povecaj za 1)
ako je (addr > 0x001FFFFF) izadji iz petlje;
u protivnom, vrati se ponovo na petlju
Dakle, ocito upotreba posebne memorijske lokacije za adresu promenljive cini kod elegantnijim i smislenijim.
Primer 2:
Nekoj funkciji treba da dostavis veliku kolicinu podataka naredjanih sekvencijalno jedno do drugog u memoriji.
Ocito je da je najlakse funkciji dostaviti pocetnu adresu prvog podatka (pointer na pocetak), ukupan broj podataka, kao i tip podatka
(tj. koliko bajtova svaki podatak zauzima). Na ovaj nacin dostavio si samo tri informacije (sto je usteda i u kolicini prenetih bajtova
i u vremenu potrosenom da se to prenese) a opet je poznato sve sto treba, sve zahvaljujuci upotrebi pointera.
Primer 3:
Pointeri mogu da pokazuju ne samo na podatke, nego i na kod (instrukcije) - to su tzv. function pointeri i/ili labele.
Upotrebom istih u nekom algoritmu se lako i elegantno programatski odredi koju tacno funkciju pozvati u kom slucaju.
To bi bilo ukratko - primera ima koliko god hoces.
[Ovu poruku je menjao milanche dana 12.08.2007. u 22:14 GMT+1]