CATEGORII DOCUMENTE |
ALOCAREA DINAMICA A MEMORIEI
POINTERI
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.
Operatii cu pointeri
Operatii de incrementare si decrementare
Operatorul de incrementare (+ +) aplicat unui operand de tip pointer spre tipul t, mareste adresa, care este valoarea operandului, cu numarul de octeti necesari pentru a pastra o data de tip t.
Operatorul de decrementare are un efect similar, diferenta constand in aceea ca in acest caz valoarea operandului se micsoreaza cu numarul de octeti necesari pentru a pastra o data de tipul spre care pointeaza operandul.
Adunarea si scaderea unui intreg dintr-un pointer
Daca p este un pointer spre tipul t si n un intreg, atunci se pot utiliza expresiile:
p+n si p-n.
Expresia p+n are ca valoare valoarea lui p marita cu produsul r*n, unde prin r am notat numarul de octeti necesari pentru a pastra in memorie o data de tipul t. Valoarea expresiei p-n este valoarea lui p micsorata cu produsul r*n.
Compararea a doi pointeri
Doi pointeri care pointeaza spre elementele aceluiasi tablou pot fi comparati folosind operatorii de relatie si de egalitate. Astfel, daca p pointeaza spre elementul t[i] si q spre elementul t[j] al aceluisi tablou t, atunci expresiile: p<q, p<=q, p>=q, p>q, p= =q si p!=q sunt egale. De exemplu, expresia p<q are valoarea adevarat daca i<j si fals in caz contrar.
Alocarea dinamica a memoriei
Limbajul C permite utilizatorului sa aloce date atat pe stiva (date automatice) cat si zone de memorie care nu apartin stivei (date globale sau statice). Alocarea datelor pe stiva se face la executie si ea nu este permanenta. Astfel, daca declaratia: tip nume; se utilizeaza in corpul unei functii, atunci variabila nume se aloca pe stiva la fiecare apel al functiei respective. La revenirea din functie, stiva se curata si prin aceasta variabila nume nu mai este alocata. O alocare de acest tip a memoriei se numeste dinamica.
Pentru datele globale sau statice, memoria este alocata in fazele precedente executiei si alocarea ramane valabila pana la terminarea executiei programului. De aceea, pentru datele de acest fel se spune ca alocarea este statica(nu este dinamica).
Limbajul C ofera posibilitatea de a aloca dinamic memorie si in alt mod decat cel indicat mai sus pentru datele automatice. Aceasta se realizeaza intr-o zona de memorie speciala, diferita de stiva. Aceasta zona de memorie se numeste memorie heap(memorie gramada, morman, de acumulare). Ea poate fi gestionata prin functii standard.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1079
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved