Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica

C


Qdidactic » stiinta & tehnica » informatica » c
Pointeri - declaratia de pointeri si tipul pointer - alocarea dinamica in C++



Pointeri - declaratia de pointeri si tipul pointer - alocarea dinamica in C++



Un pointer este o variabila care are ca valori adrese. Pointerii se utilizeaza pentru a face referire la date cunoscute prin adresele lor. Astfel, daca p este o variabila de tip pointer care are ca valoare adresa lui x, atunci *p reprezinta chiar valoarea lui x.

Fie de exemplu:


int x,y


atunci daca p are ca valoare adresa lui x, atribuirea:


y=x+100


este identica cu:




y=*p+100


Analog, atribuirea:


x=3


este identica cu:


*p=3.


In constructia *p utilizata mai sus, caracterul * se considera ca fiind un operator unar care furnizeaza valoarea din zona de memorie a carei adresa este continuta in p.

Operatorul unar * are aceeasi prioritate ca si ceilalti operatori unari din C si se asociaza de la dreapta spre stanga.

Daca p contine adresa zonei de memorie alocata lui x, vom spune ca p pointeaza spre x. De asemenea, daca p are ca valoare adresa de inceput a unei zone de memorie care contine o data de tipul tip, atunci vom spune ca p pointeaza spre tip.

In legatura cu notiunea de pointer, in limba romana se utilizeaza si alte denumiri:

referinta

localizator

reper

indicator de adresa

Pentru a atribui o adresa unei variabile de tip pointer se poate folosi operatorul unar &. Astfel, daca dorim ca p sa pointeze spre x(sa aiba ca valoare adresa lui x), atunci putem utiliza atribuirea:

p=&x.


Operatorul unar & este numit operator adresa sau de referentiere. Operatorul unar * il vom numi operator de inderectare sau de dereferentiere. Ultima denumire decurge din efectul invers al acestuia fata de operatorul unar &. Astfel, expresia:

*&x

are aceeasi valoare ca si operandul x.


Declaratia de pointeri si tipul pointer


Un pointer se declara ca orice variabila, cu singura deosebire ca numele este precedat de caracterul *. Astfel, daca dorim sa declaram variabila p utilizata mai sus pentru a pastra adresa lui x, vom folosi declaratia:


int *p


Tipul int stabileste faptul ca p contine adrese de zone de memorie in care se pastreaza date de tip int. Declaratia de mai sus se poate interpreta astfel:*p reprezinta continutul zonei de memorie spre care pointeaza p, iar acest continut are tipul int.

In general, un pointer se declara prin:


tip *nume


ceea ce inseamna ca nume este un pointer care pointeaza spre o zona de memorie ce contine o data de tipul tip.


Legatura dintre pointeri si tablouri


Numele unui tablou este un pointer deoarece el are ca valoare adresa primului sau element. Totusi exista o diferenta intre numele unui tablou si o variabila de tip pointer. Unei variabile de tip pointer i se atribuie valori la executie, in timp ce aceasta nu e posibil sa se realizeze pentru numele unui tablou. Acesta tot timpul are ca valoare adresa primului sau element. De aceea se obisnuieste sa se spuna ca numele unui tablou este un pointer constant.


Alocarea dinamica in C++


In C++, pentru alocarea dinamica se utilizeaza urmatorii operatori:

Operatorul new aloca spatiu in HEAP pentru o variabila dinamica. Dupa alocare, adresa variabilei se atribuie lui P, unde P este o variabila de tip pointer catre tip:


P = new tip;


Observatii:

- Numarul de octeti alocati in HEAP este, evident, egal cu numarul de octeti ocupat de o variabila de tipul respectiv.

- Durata de viata a unei variabile allocate in HEAP este pana la eliberarea spatiului ocupat (cu delete) sau pana la sfarsitul executarii programului.


Operatorul delete elibereaza spatial rezervat pentru variabila a carei adresa retinuta este P. Dupa eliberare, continutul variabilei P este nedefinit.


delete P;


Exemplu:


int* adr1;

adr1=new int; //se aloca spatiu in HEAP pentru o variabila de tip int.

*adr1=7; //variabila alocata retine 7.

cout<<*adr1; //se tipareste continutul variabilei.

delete adr1; //se elibereaza spatiul ocupat de variabila adr1.




Notiunea de “nod”


Spre deosebire de Pascal, in C++, se poate defini un tip care contine declarari ce se refera la el. De exemplu:


Struct nod



Campul info poate memora un numar intreg, iar campul adr face parte din tipul nod si este definit ca pointer catre acelasi tip (nod). Declararea variabilelor de tip nod se face astfel:


nod *a,*b; // 2 variabile de tip nod.


Accesul la aceste campuri se face prin simbolul “->”. De exemplu:


a->info = 7; // campul de tip int a variabilei a, ia valoarea 7.

b->info = 3;

a->adr = b; /* campul adr (de tip pointer) pointeaza spre variabila b, care este tot de tip nod. */

b->adr = a;

cout<<a->info; // va afisa 7.

cout<<a->adr->info; /* va afisa campul info din structura nodului b (adica 3), intrucat valoarea lui a->adr este b. */

cout<<a->adr->adr->info; /* va afisa campul info din structura nodului a, deoarece a->adr->adr->info este echivalent cu b->adr->info iar acesta este echivalent cu a->info, adica 7. */

a=a->adr // este echivalent cu a=b.

cout<<a->info; /* conform instructiunii de mai sus, a-ul a devenit b, deci se va afisa b->info, si anume 3. */





Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright