You are on page 1of 6

Pokaziva Pokaziva (pointer) je varijabla koja sadri adresu druge varijable.

Poto pokaziva nema izravno vezu s podacima (ne sadri podatke) govori se o indirekciji ili referenciranju. Sintaksa: tip_podataka_na koji _pokazuje *naziv_pokazivaa Primjer: int *ptr Pokaziva ptr pokazuje na cjelobrojni tip podataka (int). Pokazivai se mogu deklarirati na sve jednostavne tipove podataka (int, short, long, char itd.) kao i na objekte.(polja ili klase). Moe se slikovito usporediti s karticom na kojoj je pohranjen broj iro rauna.
8888 Kartica Marina Adresa Pokaziva 2223 3344 Broj rauna

22233344

100.000,00

Slika 18. Primjer pokazivaa Broj kartice 22233344 je pokaziva na stanje iro rauna. Adresa pokazivaa je slina broju iro rauna, a stanje iro rauna je varijabla na koju pokazuje broj rauna (pokaziva). Dereferenziranje pokazivaa Dereferenciranje pokazivaa znai prikazati sadraj na koji pokazuje pokaziva (pointer). Pokaziva u nekoj memorijskoj lokaciji uva adresu druge memorijske lokacije na kojoj je upisan odreeni sadraj. Primjer dereferenciranja pokazivaa int A = 44; int *p = &A; // Pokazivau se pridruuje adresa varijable A // kasnije... int B = *p; // Varijabli B se pridruuje vrijednost varijable na koju ukazuje pokaziva p ( tj. vrijednost varijable A). Prvo se deklarira varijabla A tipa integer. U drugom retku programa deklarira se pokaziva na cjelobrojnu vrijednost, a pokazivau se pridruuje adresa varijable A. Operator referenciranja & znai da se pokazivau pridruuje adresa (vrijednost u heksadekadnom brojevnom sustavu), a ne vrijednost koja je pohranjena na toj adresi (vrijednost pohranjena na toj adresi je 44 tj. A=44). Pomou pokazivaa se moe dobiti i vrijednost pohranjena na adresi pridruenoj pokazivau. Intuitivno bi se najvjerojatnije napravila sljedea pogreka: int B = p; // pogrean kod!!!!

Prilikom prevoenja takvog koda kompajler bi prijavio sljedeu pogreku: ne moe konvertirati int* to int. Takva pogreka je razumljiva jer su B i p dva razliita tipa podataka. Naime B je varijabla tipa integer, a p je adresa varijable A (u heksadekadnom brojevnom sustavu). Zato se za pridruivanje varijabli B vrijednosti na koju pokazuje pokaziva potrebno posluiti operatorom dereferenciranja (*): int B = *p; Operator dereferenciranja priopava kompajleru da se varijabli B pridrui vrijednost objekta na koji pokazuje pokaziva p, a ne vrijednost pohranjena u p.
*p=44

Memorijske adrese 0xFF0 B=44 0xFF1 . .

p=0xFF1

Slika 19. Koncept pokazivaa Vano je uoiti da operator dereferenciranja slui za deklariranje pokazivaa (int *p) i za derefernciranje (int B=*p). Neinicijalizirani pokaziva sadri sluajnu (neodreenu) vrijednost ( slino neinicijaliziranoj varijabli). Zato je korisno i potrebno inicijalizirati pokaziva prilikom njegove deklaracije. Slijede primjeri pristupa vrijednostima varijabli pomou pokazivaa: int X=3, *p; p=&X; //Deklaracija varijable X i pokazivaa p na cjelobrojni tip podataka //Pokazivau p se pridruuje memorijska adresa varijable X

Pristup vrijednostima varijabli pomou operatora dereferenciranja (*) Primjer

Slika 20. Pristup vrijednostima varijabli pomou pokazivaa

Pokazivai na polja Naziv polja (array) bez indeksa polja oznaava adresu prvog elementa polja. Naziv polja je pokaziva na poetak polja pa se polju moe pridruiti pokaziva. Primjer #include <vcl.h> #pragma hdrstop #include <iostream.h> void main() { int polje[]={2,4,6,8,10}; cout<<"Adresa prvog elementa polja je: "<<polje<<endl; cout<<"Vrijednost prvog elementa polja je: "<<*polje<<endl; getchar(); } Program 3: Pokazivai na polja Pojedinanom elementu polja se moe pristupiti pomou odgovarajueg indeksa polja. Dano je polje podataka iji su elementi: int polje[] = {2,4,6,8,10}; Varijabli a se pridruuje vrijednost drugog elementa polja: int a = polje[1]; // a ima vrijednost drugog elementa polja jer indeks poinje od 0, a ne 1). Slian program se moe zapisati primjenom pokazivaa. Prvo se definira polje i incijaliziraju odgovarajui indeksi, a zatim pokazivau pridrui ime polja (ime polja bez indeksa je adresa prvog elementa lana polja). Primjer int polje[] = {2,4,6,8,10}; int* p = polje; // Deklaracija pokazivaa p i pridruivanje adrese prvog lana polja. int b = p[2]; //Varijabli b se dodjeljuje trei element polja vrijednost 6.

Slika 21. Pristup elementima polja pomou pokazivaa

Nakon prevoenja programa dobiva se rezultat koji se lako moe razumjeti na temelju prethodnih objanjenja. Pokazivai na funkcije Pokazivaima se mogu pridruivati i adrese funkcija. To svojstvo pokazivaa se esto primjenjuje u objektno orijentiranom programiranju. Naziv funkcije zamjenjuje se pokazivaem dok ostali dijelovi zaglavlja funkcije se ne mijenjaju (tip povratka i argumenti funkcije). Pokaziva na funkciju se definira na slijedei nain: <tip povratka> (*naziv)( <tip> p1, <tip> p2,.., <tip> pn) Objanjenja: (*naziv) je naziv pokazivaa, a on pokazuje na funkciju. <tip povratka> je tip podataka koji funkcija vraa. (<tip> p1,...) su parametri funkcije. Porebno je ponovno navesti primjer kako bi se razumjela uporaba pokazivaa na funkcije u programima. Primjer #include <vcl.h> #include <iostream.h> void izlaz() //Definicija funkcije izlaz { cout<<"Upisati neki broj:" <<endl; } int zbroj(int x, int y) //Definicija funkcije zbroj. { return(x+y); } void main() { int a,b; void (*pNaFunkciju1)(void); //Definicija pokazivaa na funkciju pokazivacNaFunkciju1 // i on nema povratne vrijednosti ni nema ulaznih parametara. int (*pNaFunkciju2)(int, int); // Definicija pokazivaa na funkciju pokazivacNaFunkciju2 // povratna vrijednosti tipa int i ulazni parametri tipa int. pNaFunkciju1=izlaz; //Pokazivau pNaFunkciju1 se pridruuje adresa funkcije izlaz,a // adresa je naziv funkcije bez malih zagrada!) pNaFunkciju2=zbroj; // Pokazivau pNaFunkciju2 se pridruuje adresa funkcije zbroj pNaFunkciju1(); //Poziv funkcije preko pokazivaa pNaFunkciju1, dakle funkcija izlaz. cin>> a; pNaFunkciju1(); //Poziv funkcije preko pokazivaa pNaFunkciju1, ponovno funkcija izlaz cin>>b; cout<<"Zbroj varijabli a i b je "<<pNaFunkciju2(a,b)<<endl;// Poziv funkcije pomou pokazivaa, pNaFunkciju2, dakle funkcija zbroj. getchar(); }

Program 4: Primjena pokazivaa na funkcije Bitno je uoiti da je naziv funkcije (bez malih zagrada) njezina adresa u memoriji raunala. Slino svojstvo primjenjuje se i za polje. Kao to je pokazano, naziv polja je memorijska adresa prvog lana polja. Pokaziva na pokaziva Osim pokazivaa na varijable i funkcije moe se deklarirati i pokaziva na pokaziva. Pokaziva na pokaziva ima slijedeu sintaksu: <tip> **naziv_pokazivaa; Pojanjenje: Pokaziva **naziv_pokazivaa pokazuje na pokaziva koji pokazuje na tip varijable tip. Mnogo je sloenije napisati to pokazuje pokaziva na pokaziva, nego razumjeti i primijeniti u programima. Zato ponovno slijedi primjer. #include <iostream.h> void main() { int x, y, *xptr, **ptrptr; //Deklaracija varijabli x,y, pokazivaa xptr i pokazivaa na //pokaziva ptrptr. x=10; y=10; cout<<"x = "<<x<<endl; xptr=&x; //Pokazivau xptr se pridruuje adresa varijable x . *xptr=20; //Vrijednost varijable na koju pokazuje xptr postavlja se na 20. cout<<"x = "<<x<<" i *xptr = " <<*xptr<<endl; ptrptr=&xptr; //Pokazivau ptrptr se pridruuje adresa pokazivaa xptr. **ptrptr=30; //Varijabli x se preko pokazivaa **ptrptr pridruuje vrijednost 30. cout<<"x = "<<x<<" *xptr = "<<*xptr<<" i **ptrptr = "<<**ptrptr<<endl; *ptrptr=&y; //Pokaziva sada pokazuje na varijablu y. **ptrptr=40;//Varijabli y se pridruuje 40, jer ptrptr pokazuje na ptr, a ptr sada na y. cout<<"x = "<<x<<", y= "<<y<<", *xptr = "<<*xptr<<" i **ptrptr ="<<**ptrptr<<endl; getchar() ; } Program 5. Program za koncept pokaziva na pokaziva Pojanjenja bitnih dijelova programa: Deklaracije varijable: x i y tipa int, pokazivaa: xptr, koji pokazuje na varijablu tipa int, pokazivaa: ptrptr, koji pokazuje na pokaziva, a on sadri adresu jedne varijable tipa int, Pridruivanje pokazivau xptr se pridruuje adresa varijable x, xptr pokazuje prvo na x, varijabli x se pridruuje 20 preko pokazivaa xptr dereferenciranjem, pokaziva ptrptr se pridruuje adresa pokazivaa xptr, tj. ptrptr pokazuje na xptr, pokazivau xptr se pridruuje 30 preko pokazivaa ptrptr dereferenciranjem, a to je implicitno pridruivanje vrijednosti varijabli x preko pokazivaa xptr Pridruivanje pokazivau xptr se pridruuje adresa varijable y, xptr sada pokazuje na y,

varijabli y se pridruuje 40 preko pokazivaa xptr dereferenciranjem, a to je implicitno pridruivanje vrijednosti varijabli y preko pokazivaa xptr. Referenciranje varijable x preko pokazivaa *xptr e time biti zavreno, tj. pokaziva *xptr ne pokazuje vie na varijablu x ! Cijeli program je mogue komprimirati u zakljuak da je mogue je pristupiti bilo kojoj varijabli preko pokazivaa na tu varijablu. To je smisao primjene pokazivaa na pokaziva.

You might also like