You are on page 1of 3

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 razumijeti i primjeniti
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.

Reference
Referenca je posebna vrsta pokazivaa koja promatra pokazivae kao objekte. One se uvijek
deklariraju pomou operatora za referenciranje (&).
Sintaksa: <tip> & naziv;
Primjer deklaracije i inicijalizacije reference
int A;
int &rA = A;
rA = 50 ; // rA je referenca na varijablu A. Znai to i naredba A=50.
Reference se uvijek istodobno deklariraju i inicijaliziraju: int &rA = A;

Reference i pokazivaa kao argumenati funkcije


Objekti se mogu u funkcije prenositi kao vrijednosti. Ako se funkcije slue strukturom i
klasom uvijek je bolje njihove objekte prenositi kao reference nego kao vrijednosti. Isto
vrijedi i za elementarne tipove podataka (npr. long ili int).
Primjer
void kvadrat(int &x) // Argument funkcije kvadrat se prenosi kao referenca.
{...}
Ako se parametar funkcije prenosi kao vrijednost, onda se stvara kopija objekta i
funkcija izvrava operacije s kopijom.
Ako se parametar prenosi kao referenca, onda se u funkciju predaje samo pokaziva na
objekt ali ne i sam objekt (ne stvara se kopija). Iz te injenice slijede dvije bitne
(odluujue) posljedice:
a) argumente mogu promijeniti samo funkcije, ako se oni prenose kao reference,
b) ne stvara se kopija objekta (argumenta) na koji se referencira.
Ponovno slijedi primjeri iz kojih e biti vidljive razlike u prijenosu argumenata funkcije kao
referenci u odnosu na prijenos po vrijednostima. Slijedi primjer prijenosa parmetara funkcije
kao referenci.
#include <vcl.h>
#include<iostream.h>
void s(int &x, int &y)
{
--x; // Vrijednost se varijable x umanjuje za 1.
--y; // Vrijednost se varijable y umanjuje za 1.
cout <<x<<endl;
cout<<y;
}
void main ()
{
int a = 43; int b = 40;
s(a, b); // a=42, a druga je varijabla b=39
getchar();
}
Program 6. Reference kao argumenti funkcije
Drugo se rjeenje moe prikazati bez primjene referenci. Parametri funkcije su varijable
xPozicija i yPozicija tipa int.

#include <vcl.h>
#include<iostream.h>
void s(int &x, int &y)
{--x; //x se umanjuje za 1
--y;}
void main () {
int a = 43;
int b = 40;
s(a, b); // a=42, a b=39.
cout <<a<<endl;
cout<<b;
getchar(); }

a)

#include <vcl.h>
#include<iostream.h>
void s(int x, int y)
{--x; //x se umanjuje za 1.
--y;}
void main () {
int a = 43;
int b = 40;
s(a, b); // a=43, a b=40.
cout <<a<<endl;
cout<<b;
getchar();}

b)

Program 7. Prijenos parametara funkcije po vrijednosti i pomou referenci


Oba se parametra funkcije dekrementiraju (umanjuju) za 1. U programu a) je varijabla
a=42 i varijabla b=39 (one se umanjuju za jedan) jer funkcija ne koriste kopije varijabli a i
b. U drugom primjeru vrijednosti varijabli a i b ostaju nepromijenjene tj. a=43 i b=40 jer se
funkcija void s(int x, int y) slui kopijama varijabli a i b. Vrijednosti varijabli a i b se ne
mijenjaju nego se mijenjaju njihove kopije, a to su varijable x i y. Varijable a i b zadravaju
vrijednosti.
Ako su argumenti funkcija elementarni tipovi podataka, onda se ne stvaraju posebne
potekoe u radu s kopijama vrijednosti varijabli (prijenosom po vrijednosti). Problemi mogu
nastupiti uporabom kopija sloenijih struktura podataka kao argumenata funkcije. Zato
instance sloenijih struktura podataka (npr. klasa) treba prenositi iskljuivo pomou
referenci.

You might also like