Documente Academic
Documente Profesional
Documente Cultură
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
PROIECTAREA
ALGORITMILOR
Recomandare
Curs 2
Alocarea dinamic de
memorie n C++
Coninutul cursului
1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri
1. Tipuri de date
Informaia care st la dispoziia calculatorului const dintr-o
mulime de date care descriu lumea real prin abstractizare.
O abstractizare este de fapt o simplificare a faptelor prin
reinerea caracteristicilor relevante ale obiectelor reale.
O dat este orice entitate asupra creia poate opera
calculatorul.
Astfel apare noiunea de tip de date.
Prin tip de date se nelege o mulime de valori D care
formeaz domeniul tipului, mpreun cu o mulime de
operatori pe acest domeniu.
n cazul cnd elementele domeniului sunt valori compuse din
mai multe componente atomice, tipul de date obinut se
numete tip de date structurat sau structur de date.
1. Tipuri de date
Din punct de vedere al implementrii lor, putem vorbi despre
date implementate static i dinamic.
Criteriul de clasificare este dat de modul de alocare a
memoriei interne.
1. Pentru structurile statice memoria se aloc la nceputul
programului i rmne alocat ct timp programul se execut.
Astfel, caracteristicile variabilelor statice sunt bine definite,
cunoscute i fixe.
Structura, tipul i adresa de memorie nu se pot modifica n
timpul execuiei programului.
De asemenea, variabilele statice sunt referite prin numele lor,
fiecrui nume asociindu-i-se o adres fizic de memorie.
1. Tipuri de date
Unei variabile statice i se poate modifica doar valoarea,
nu i adresa din memoria intern.
Scopul definirii tipurilor de date este acela de:
a fixa domeniul valorilor pe care le pot lua aceste variabile
de a preciza structura, dimensiunea i amplasarea zonelor
de memorie ce le sunt asociate
Deoarece toate aceste elemente sunt fixate de la
nceput de catre compilator, astfel de variabile i
structurile de date aferente lor se numesc statice.
1. Tipuri de date
1. Tipuri de date
a) Datele elementare (aa numitele tipuri scalare)
sunt reprezentate n structura intern a
sistemului prin iruri de bii asupra crora
acioneaz mecanismul de adresare i care pot
constitui operanzii direci ai operaiilor sistemului
de calcul.
Date elementare se considera scalarii
predefinii:
1) ntregi
2) reali
3) caracter
Proiectarea Algoritmilor - curs 9
2
1. Tipuri de date
b) Datele compuse sunt determinate de o
descriere a tipului componentelor lor i prin
indicarea metodelor de structurare a
acestora.
Sunt considerate date compuse:
1) tablourile
2) nregistrrile
3) irurile de caractere
4) fiierele, etc
Proiectarea Algoritmilor - curs 10
2
1. Tipuri de date
1. Tipuri de date
Coninutul cursului
1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri
2. Tipul referin
Din punctul de vedere al unui programator, memoria
calculatorului se prezint ca o succesiune de octei,
fiecare octet avnd o adres binar bine stabilit.
Aceti octei sunt identificai prin numere cuprinse
ntre 0 i n-1(n este numarul de octeti al tipului de
date folosit pentru o variabila).
Putem numi aceast adres numrul de ordine al
unui octet.
Pentru fiecare tip de dat cunoscut exist o anumit
logic potrivit creia se face memorarea efectiv a
coninutului.
2. Tipul referin
2. Tipul referin
2. Tipul referin
Pointerii sunt variabile statice obinuite i au ca
valori adrese, care pot fi adresele de nceput ale
unor structuri dinamice sau a unei componente
a unei asemenea structuri.
Deci, accesul la o variabil dinamic, indicat de
o variabil pointer se realizeaz prin adresarea
indirect a variabilei pointer.
Aceast indirectare se pune n eviden prin
ataarea operatorului unar * (operator de
indirectare) nainte de numele variabilei pointer.
Proiectarea Algoritmilor - curs 17
2
2. Tipul referin
Variabila dinamic, indicat de o variabil pointer,
se va referi, nu printr-un nume propriu, ci prin
intermediul pointerului su:
*variabila de tip pointer
Astfel, n construcia *p operatorul * se
consider ca fiind un operator unar care
furnizeaz valoarea din zona de memorie a crei
adres este coninut n p
p = variabila de tip pointer
*p = variabila dinamic indicat de pointerul p
2. Tipul referin
2. Tipul referin
Declararea unui pointer:
Un pointer se declar ca orice variabil, cu singura
deosebire c numele este precedat de caracterul
*.
Astfel, dac, de exemplu, dorim s declarm
variabila p utilizat anterior pentru a pstra
adresa unei variabile de tip int x, vom folosi
declaraia int *p.
Tipul int stabilete n acest caz faptul c p conine
adrese de zone de memorie alocate datelor de tip
int.
Proiectarea Algoritmilor - curs 20
2
2. Tipul referin
Declaraia lui p se poate interpreta n felul
urmtor:
*p reprezint coninutul zonei de
memorie spre care indic p, iar acest coninut
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
conine o dat de tipul tip.
Proiectarea Algoritmilor - curs 21
2
2. Tipul referin
O variabil pointer dat se poate referi la variabilele
indicate de un anumit tip, conform definirii sale.
Exist totui i pointerul nul identificat prin cuvntul
rezervat NULL i care este compatibil cu orice tip
pointer.
De asemenea, exist cazuri n care dorim ca un
pointer s fie utilizat cu mai multe tipuri de date.
n acest caz, la declararea lui nu dorim s specificm
un tip anume.
Aceasta se realizeaz folosind cuvntul cheie void:
void *nume
2. Tipul referin
2. Tipul referin
Exemple:
Fie declaraiile:
int x, y;
y = x + 100;
este echivalent cu secvena
int *p;
p = &x;
y = *p + 100; // lui y i se atribuie suma dintre coninutul
zonei a crei adres se afla n p i 100
2. Tipul referin
Exemplul 2:
x=y;
este echivalent cu secvena
p=&x;
*p=y; // coninutul zonei a crei adres se afl n p devine egal cu
valoarea lui y
Exemplul 3:
x++;
este echivalent cu secvena
p=&x;
(*p)++; // continuul zonei a crei adres se afl n p se mrete
cu 1
2. Tipul referin
Pentru a realiza o Avnd n vedere
interschimbare a valorilor acest lucru, funcia va
acestor variabile, este suferi modificri:
necesar s se transfere nu void f(int *x, int *y)
valorile, ci adresele
variabilelor. {
Acest lucru este posibil dac int aux;
modificm apelul n felul aux = *x;
urmtor: *x = *y;
f(&a, &b) - transmiterea *y = aux;
parametrilor prin referin.
}
Coninutul cursului
1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri
3. Operaii cu pointeri
1. Atribuirea:
o variabil de tip pointer primete
valoarea unei alte variabile sau funcii de
acelai tip pointer cu ea sau este iniializat
cu constanta NULL.
nainte de atribuire: q *q
q *q
3. Operaii cu pointeri
2. Operaii de incrementare i decrementare:
Asupra variabilelor de tip pointer operatorii de
incrementare i decrementare se execut altfel dect
asupra datelor de alte tipuri.
operatorul de incrementare aplicat asupra unui
operand de tip pointer spre tipul t mrete adresa
coninut de operand cu numrul de octei necesari
pentru a pstra o dat de tipul t;
operatorul de decrementare se execut n mod
analog, cu singura diferen ca n loc s se mreasc
valoarea pointerului, ea se micoreaz cu numrul
corespunztor de octei.
Proiectarea Algoritmilor - curs 31
2
3. Operaii cu pointeri
Aceste operaii sunt Fie atribuirea p=&tab[i]; unde
deosebit de utile cnd 0<i<100.
au loc prelucrri de n acest caz, instruciunea p++;
tablouri. mrete valoarea lui p cu 2 (tipul
Fie urmtoarele int se pstreaz pe doi octei) i
declaraii: deci n acest moment p conine
adresa elementului tab[i+1].
int tab[100]; n mod analog, instruciunea p--;
int *p; micoreaz valoarea lui p cu 2 i
deci n urma acestei decrementri
int i;
p conine adresa elementului
tab[i-1].
3. Operaii cu pointeri
3. Operaii cu pointeri
Dac x este un tablou de tipul t, atunci x este pointer,
deci o expresie de forma x+n este corect i
deoarece x este un pointer spre primul su element
x[0], x+n va fi un pointer spre elementul x[n].
Rezult c valoarea elementului x[n] se poate
reprezenta prin expresia *(x+n) care este o expresie
cu pointeri.
Astfel, o expresie cu indici se poate nlocui printr-o
expresie cu pointeri.
Acest lucru permite ca la tratarea tablourilor s se
foloseasc expresii cu pointeri n locul variabilelor cu
indici.
Proiectarea Algoritmilor - curs 34
2
3. Operaii cu pointeri
3. Operaii cu pointeri
Observaii:
Pointerii nu pot fi comparai dect n condiia
amintit mai sus.
Operatorii de egalitate ( = = i ! = ) permit
totui compararea unui pointer cu constanta
simbolic NULL. Aceste comparaii permit s
stabilim dac un pointer conine o adres sau
nu.
3. Operaii cu pointeri
3. Operaii cu pointeri
Exemplul 1:
unsigned lungime(char *x) // returneaz lungimea
irului spre care pointeaz x
{
int i;
for(i=0; *x!=\0; i++)
x++;
return i;
}
3. Operaii cu pointeri
Observaii:
3. Operaii cu pointeri
Exemplul 2:
void copiaz(char *x, char *y) // copiaz irul spre care indic
y n zona spre care indic x
{ while(*x++ = *y++); }
Expresia de atribuire *x++=*y++ realizeaz atribuirea *x=*y
utiliznd valorile neincrementate ale lui x i y.
Dac valoarea atribuit este diferit de zero, expresia de
atribuire se consider adevarat, deci ciclul continu.
n momentul n care se atribuie valoarea 0, adic s-a ajuns
la sfaritul irului spre care indic y, expresia de atribuire
este fals i ciclul se ntrerupe.
3. Operaii cu pointeri
Exemplul 3:
void concateneaz(char *x, char *y) // concateneaz
irul spre care indic y la sfritul irului spre care indic x
{
// se avanseaz cu pointerul x pn la sfritul irului
while(*x) x++;
// se copiaz irul spre care indic y n zona spre care indic x
while(*x++ = *y++);
}
Coninutul cursului
1. Tipuri de date
2. Tipul referin
3. Operaii cu pointeri
4. Legtura dintre pointeri i tablouri
2) Fie declaraiile:
int a[10],b[10],*c;
.
a=b; // greit deoarece a i b sunt pointeri constani
c=a; // corect deoarece c este un pointer variabil
b=c; // greit deoarece chiar dac c este un pointer variabil,
pointerul din partea stnga a atribuirii, b, este constant
Tip *tablou[dim];
Exemplu:
n definiia
Aplicatie
ntrebri?