| Referate | Director web | Adauga link | Contact |

Titlu referat: ALOCAREA DINAMICa A MEMORIEI

Nivel referat: facultate

Descriere referat:
ALOCAREA DINAMICĂ A MEMORIEI
       POINTERI
       
       Un
pointer este o variabilă care are ca valori adrese. Pointerii se utilizează
pentru a face referire la date cunoscute prin adresele lor. Astfel, dacă
p este o variabilă de tip
pointer care are ca valoare adresa lui x, atunci
*p reprezintă chiar
valoarea lui x.
Fie de exemplu:
int x,y;
atunci dacă p are ca valoare adresa lui x, atribuirea:
y=x+100
este identică cu:
y=*p+100
Analog, atribuirea:
x=3
este identică cu:
       *p=3.
       În
construcţia *p utilizată
mai sus, caracterul * se consideră ca fiind un operator unar
care furnizează valoarea din zona de memorie a cărei adresă este conţinută
în p.
       Operatorul unar * are aceeaşi prioritate ca şi ceilalţi operatori unari din C şi
se asociază de la dreapta spre stânga.
       Dacă
p conţine adresa zonei de
memorie alocată lui x, vom
spune că p pointează
spre x. De asemenea, dacă
p are ca valoare adresa de
început a unei zone de memorie care conţine o dată de tipul tip, atunci vom spune că p pointează spre tip.
       În
legătură cu noţiunea de pointer, în limba română se utilizează şi alte
denumiri:
referinţă
localizator
reper
indicator de adresă
Pentru a atribui o adresă unei variabile de
tip pointer se poate folosi operatorul unar &. Astfel, dacă dorim ca p să pointeze spre x(să aibă ca
valoare adresa lui x), atunci putem utiliza
atribuirea:
p=&x.
Operatorul unar & este numit operator adresă sau de
referenţiere. Operatorul unar * îl vom numi operator de inderectare sau de
dereferenţiere. Ultima denumire decurge din efectul invers al acestuia faţă
de operatorul unar &.
Astfel, expresia:
*&x
are aceeaşi valoare ca şi operandul x.
       Declaraţia de pointeri şi tipul pointer
       Un
pointer se declară ca orice variabilă, cu singura deosebire că numele este
precedat de caracterul *. Astfel, dacă dorim să declarăm variabila
p utilizată mai sus pentru
a păstra adresa lui x, vom
folosi declaraţia:
       int
*p
       Tipul int stabileşte faptul că p conţine adrese de zone de memorie în care se păstrează date de
tip int. Declaraţia de mai
sus se poate interpreta astfel:
*p reprezintă conţinutul zonei de memorie
spre care pointează p, iar acest conţinut are tipul int.
       În
general, un pointer se declară prin:
       tip
*nume
ceea ce înseamnă că nume este un pointer care pointează spre
o zonă de memorie ce conţine o dată de tipul
tip.
       
       Legătura dintre pointeri şi tablouri
       Numele unui tablou este un pointer deoarece el are ca valoare
adresa primului său element. Totuşi există o diferenţă între numele unui
tablou şi o variabilă de tip pointer. Unei variabile de tip pointer i se
atribuie valori la execuţie, în timp ce aceasta nu e posibil să se realizeze
pentru numele unui tablou. Acesta tot timpul are ca valoare adresa primului
său element. De aceea se obişnuieşte să se spună că numele unui tablou
este un pointer constant.
       Operaţii cu pointeri
       Operaţii de incrementare şi decrementare
     
 Operatorii + + şi -
-  se pot aplica la operanzi de tip pointer. Ei se execută altfel decât
asupra datelor care nu sunt pointeri.
       Operatorul de incrementare (+ +) aplicat unui operand de tip
pointer spre tipul t,
măreşte adresa, care este valoarea operandului, cu numărul de octeţi
necesari pentru a păstra o dată de tip t.
       Operatorul de decrementare are un efect similar, diferenţa
constând în aceea că în acest caz valoarea operandului se micşorează cu
numărul de octeţi necesari pentru a păstra o dată de tipul spre care
pointează operandul.
       
       Adunarea şi scăderea unui întreg dintr-un pointer
       Dacă p este un pointer spre tipul
t şi n un întreg, atunci se pot utiliza expresiile:
       p+n
şi p-n.
       Expresia p+n
are ca valoare valoarea lui p mărită cu produsul r*n, unde prin r
am notat numărul de octeţi necesari pentru a păstra în memorie o dată de
tipul t. Valoarea expresiei
p-n este valoarea lui
p micşorată cu produsul
r*n.
       
       Compararea a doi pointeri
       Doi
pointeri care pointează spre elementele aceluiaşi tablou pot fi comparaţi
folosind operatorii de relaţie şi de egalitate. Astfel, dacă p pointează spre elementul t[i] şi q
spre elementul t[j] al aceluişi tablou t, atunci expresiile: p=q, p>q,   p= =q şi p!=q sunt egale. De exemplu,
expresia padevărat dacă ifals în caz contrar.
       
Alocarea dinamică a memoriei
       Limbajul C permite utilizatorului să aloce date atât pe stivă
(date automatice) cât şi zone de memorie care nu aparţin stivei (date
globale sau statice). Alocarea datelor pe stivă se face la execuţie şi ea nu
este permanentă. Astfel, dacă declaraţia: tip
nume; se utilizează în corpul unei funcţii, atunci
variabila nume se alocă pe stivă la fiecare apel al funcţiei respective. La
revenirea din funcţie, stiva se curăţă şi prin aceasta variabila
nume nu mai este alocată. O
alocare de acest tip a memoriei se numeşte dinamică.
       Pentru datele globale sau statice, memoria este alocată în fazele
precedente execuţiei şi alocarea rămâne valabilă până la terminarea
execuţiei programului. De aceea, pentru datele de acest fel se spune că
alocarea este statică(nu
este dinamică).
       Limbajul C oferă posibilitatea de a aloca dinamic memorie şi în
alt mod decât cel indicat mai sus pentru datele automatice. Aceasta se
realizează într-o zonă de memorie specială, diferită de stivă. Această
zonă de memorie se numeşte memorie heap(memorie grămadă, morman, de acumulare). Ea poate fi gestionată
prin funcţii standard.



Curs valutar
Euro4,5511
Dolarul american4,2615
Lira Sterlina5,3015
Gramul de aur170,1555
Leul moldovenesc0,2176
Materii referate

Anatomie (61)

Astronomie (61)

Biologie (546)

Chimie (530)

Contabilitate (87)

Design (4)

Diverse (878)

Drept (356)

Ecologie (59)

Economie (520)

Educatie Fizica (2)

Educatie si Invatanmant (2)

Engleza (463)

Filosofie (99)

Fizica (343)

Franceza (25)

Geografie (838)

Germana (40)

Informatica (354)

Istorie (1169)

Italiana (21)

Latina (26)

Literatura (22)

Logica (6)

Management (133)

Marketing (118)

Matematica (114)

Mecanica (13)

Medicina si Farmacie (229)

Muzica (35)

Psihologie (337)

Religie (248)

Romana (2303)

Spaniola (31)

Statistica (17)

Stiinte politice (27)

Turism (64)

Nota explicativa

Informatiile oferite de acuz.net au scop educativ si orientativ pentru cercetare academica. Va recomandam utilizarea acestora doar ca sursa de inspiratie sau ca resurse educationale.