Pokazivač na pokazivač Osim pokazivača na varijable i funkcije može se deklarirati i pokazivač na pokazivač.

Pokazivač na pokazivač ima slijedeću sintaksu: <tip> **naziv_pokazivača;
Pojašnjenje: Pokazivač **naziv_pokazivača pokazuje na pokazivač koji pokazuje na tip varijable tip. Mnogo je složenije 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, pokazivača xptr i pokazivača na //pokazivač ptrptr. x=10; y=10; cout<<"x = "<<x<<endl; xptr=&x; //Pokazivaču xptr se pridružuje adresa varijable x . *xptr=20; //Vrijednost varijable na koju pokazuje xptr postavlja se na 20. cout<<"x = "<<x<<" i *xptr = " <<*xptr<<endl; ptrptr=&xptr; //Pokazivaču ptrptr se pridružuje adresa pokazivača xptr. **ptrptr=30; //Varijabli x se preko pokazivača **ptrptr pridružuje vrijednost 30. cout<<"x = "<<x<<" *xptr = "<<*xptr<<" i **ptrptr = "<<**ptrptr<<endl; *ptrptr=&y; //Pokazivač sada pokazuje na varijablu y. **ptrptr=40;//Varijabli y se pridružuje 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č“ Pojašnjenja bitnih dijelova programa: Deklaracije varijable: x i y tipa int, pokazivača: xptr, koji pokazuje na varijablu tipa int, pokazivača: ptrptr, koji pokazuje na pokazivač, a on sadrži adresu jedne varijable tipa int, Pridruživanje pokazivaču xptr se pridružuje adresa varijable x, xptr pokazuje prvo na x, varijabli x se pridružuje 20 preko pokazivača xptr dereferenciranjem, pokazivač ptrptr se pridružuje adresa pokazivača xptr, tj. ptrptr pokazuje na xptr, pokazivaču xptr se pridružuje 30 preko pokazivača ptrptr dereferenciranjem, a to je implicitno pridruživanje vrijednosti varijabli x preko pokazivača xptr Pridruživanje pokazivaču xptr se pridružuje adresa varijable y, xptr sada pokazuje na y, varijabli y se pridružuje 40 preko pokazivača xptr dereferenciranjem, a to je implicitno pridruživanje vrijednosti varijabli y preko pokazivača xptr. Referenciranje varijable x preko pokazivača *xptr će time biti završeno, tj. pokazivač *xptr ne pokazuje više na varijablu x ! Cijeli program je moguće komprimirati u zaključak da je moguće je pristupiti bilo kojoj varijabli preko pokazivača na tu varijablu. To je smisao primjene pokazivača na pokazivač.

1

Reference
Referenca je posebna vrsta pokazivača koja promatra pokazivače kao objekte. One se uvijek deklariraju pomoću operatora za referenciranje (&). Sintaksa: <tip> & naziv; Primjer deklaracije i inicijalizacije reference int A; int &rA = A; rA = 50 ; // rA je referenca na varijablu A. Znači što i naredba A=50. Reference se uvijek istodobno deklariraju i inicijaliziraju: int &rA = A;

Reference i pokazivača kao argumenati funkcije
Objekti se mogu u funkcije prenositi kao vrijednosti. Ako se funkcije služe 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 izvršava 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 (odlučujuće) 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 rješenje može prikazati bez primjene referenci. Parametri funkcije su varijable xPozicija i yPozicija tipa int.

2

#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(); }

#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();}

a)

b)

Program 7. Prijenos parametara funkcije po vrijednosti i pomoću 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) služi 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 zadržavaju vrijednosti. Ako su argumenti funkcija elementarni tipovi podataka, onda se ne stvaraju posebne poteškoće u radu s kopijama vrijednosti varijabli (prijenosom po vrijednosti). Problemi mogu nastupiti uporabom kopija složenijih struktura podataka kao argumenata funkcije. Zato instance složenijih struktura podataka (npr. klasa) treba prenositi isključivo pomoću referenci.

3

Sign up to vote on this title
UsefulNot useful