Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
PROIECTAREA
ALGORITMILOR
Lector dr. Adrian Runceanu
1
Curs 2
Alocarea dinamic de
memorie n C++
Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri
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.
Proiectarea Algoritmilor - curs
1. Tipuri de date
Din punct de vedere al implementrii lor, putem
vorbi despre:
1. date implementate static
2. date implementate dinamic
Criteriul de clasificare este dat de modul de
alocare a memoriei interne.
1. Tipuri de date
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.
Proiectarea Algoritmilor - curs
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
1. Tipuri de date
Din motive de memorare a datelor n
calculator, n limbajele de programare, datele
sunt formate din dou clase:
a) date elementare
b) date compuse
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
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(structurile)
3) irurile de caractere
4) fiierele, etc
Proiectarea Algoritmilor - curs
10
1. Tipuri de date
2. Pentru structurile dinamice se aloc memorie n
timpul execuiei programului, iar cnd nu mai
este necesar, memoria se elibereaz.
Totui, variabilele dinamice au un tip bine
precizat nc din faza de compilare, ns ele pot
fi alocate dinamic, pot fi utilizate prin adresa lor
din heap i pot fi distruse dac nu mai sunt utile.
Aceste variabile pot fi referite printr-o variabil
de tip referin ce conine adresa variabilei
dinamice.
Proiectarea Algoritmilor - curs
11
1. Tipuri de date
Structurile dinamice cuprind:
listele i arborii
Lista este o structur de date definit cu
ajutorul unor relaii de ordine asupra
nregistrrilor.
Arborele este o structur de date definit
cu ajutorul unor relaii de ordine asupra
listelor.
Proiectarea Algoritmilor - curs
12
Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri
13
2. Conceptul de pointer
Un pointer (variabila referin) este o variabil
care are ca valoare adresa unui obiect cu care
opereaz limbajul C/C++ (variabil, constant,
funcie).
14
2. Conceptul de pointer
Astfel putem enumera 2 (dou) situaii n care
limbajul C/C++ folosete pointerii, i anume:
atunci cnd se transmite unei funcii o matrice sau
un ir de caractere
sau cnd se transmit parametri prin referin,
adic atunci cnd vrem s modificm variabilele
respective
Proiectarea Algoritmilor - curs
15
2. Conceptul de pointer
Declararea unei variabile de tip pointer se face astfel:
tip *nume_pointer;
Unde:
tip reprezint oricare dintre tipurile limbajului C/C++
i indic tipul variabilei a crei adres este
memorat de variabila pointer.
nume_pointer reprezint numele ales de utilizator
pentru a identifica pointerul respectiv
operatorul * este obligatoriu la declarare
Proiectarea Algoritmilor - curs
16
2. Conceptul de pointer
Exemple:
char *pc; // pointer de tip caracter
int *pi;
// pointer de tip ntreg
float *pf; // pointer de tip real
Observaie:
Pot exista i pointeri fr tip, care se declar astfel:
void *nume_pointer;
17
2. Conceptul de pointer
Un pointer este un grup de octei (adesea doi
sau patru) care poate conine o adres.
Astfel dac c este un char i p un pointer care
trimite ctre el, atunci am putea reprezenta situaia
astfel:
c
Valoarea lui c
p
Adresa de
memorie a lui c
Proiectarea Algoritmilor - curs
18
Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri
19
20
21
22
23
24
25
26
Exemplu:
Urmtorul program atribuie pointerului adresa
unei variabile de tip ntreg, afieaz adresa sa
mpreun cu valoarea memorat la adresa pe care o
are pointerul, apoi modific valoarea variabilei prin
intermediul pointerului i o afieaz.
Proiectarea Algoritmilor - curs
27
28
Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri
29
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
n limbajul C++ exist o stns legtur ntre
pointeri i tablouri, astfel nct orice problem care
se poate rezolva cu tablouri, poate fi rezolvat i
cu pointeri.
Putem spune c un pointer care reine adresa unui
tablou, reine de fapt adresa primului element al
tabloului.
Proiectarea Algoritmilor - curs
30
4. Aritmetica pointerilor
Exemplu:
int a[20], *p;
p:
p=&a[0];
a:
a[0] a[1]
a[19]
31
4. Aritmetica pointerilor
Dac p este un pointer ctre un element al unui
tablou oarecare, atunci:
p+1 este un pointer ctre elementul urmtor al tabloului,
p+i se refer la elementul al i-lea,
iar p-i la elementul al i-lea nainte de p.
p
p+1
p+i
a[19]
32
4. Aritmetica pointerilor
Observaie:
n expresia p+i ne apare faptul c exemplificm pe
un tablou cu elemente de tip ntreg. De unde putem
concluziona c:
Dac p este un pointer ctre un obiect ( tip_obiect
*p ), atunci p+i va fi un pointer ctre al i-lea obiect
aflat dup obiectul referit de p.
Numele unei variabile de tip tablou este de fapt
adresa primului element ( adic adresa elementului
0 al tabloului ).
Deci: p = &a[0];
p = a;
33
4. Aritmetica pointerilor
Dac p i q sunt doi pointeri ctre elemente ale
aceluiai tablou ( adic p = &a[i] i q = &a[j] ), atunci
putem efectua urmtoarele operaii:
1) Comparaii:
p == q // adic se compar i cu j
p != q
p<q
p <= q
p>q
p >= q
2) p q // adic numrul de elemente ale tabloului, care
se afl ntre elementul referit de p i elementul referit de q
Proiectarea Algoritmilor - curs
34
4. Aritmetica pointerilor
35
4. Aritmetica pointerilor
4.2. Echivalene de scriere
!
Deci, putem scrie:
a[i]
*(a+i)
p = &a[0]
p=a
p+1
*(p + 1)
p+i
&a[1]
a[1]
&a[i]
a+1
*(a + 1)
a+i
&a[1]
a[1]
&a[i]
*(a + i)
a[i]
*(i +a)
i[a]
36
4. Aritmetica pointerilor
Din echivalenele de mai sus, putem desprinde
o regul a compilatorului C++, i anume:
Orice expresie de forma a[i] este transformat
imediat ntr-o expresie *(a+i), adic o expresie
n care apare un pointer ( adic a ) i un
deplasament ( adic i ).
37
4. Aritmetica pointerilor
Exemplu:
Urmtorul program prezint ultima regul
obinut mai sus i anume a[i] i[a].
38
4. Aritmetica pointerilor
Observaie:
Succesiunea operatorilor &* aplicat unui pointer
cu deplasament are ca efect (evaluarea se face de
la dreapta la stanga):
la primul pas, selectarea coninutului (valorii) de la
respectiva adres
iar la al doilea pas, selectarea adresei respectivului
coninut
4. Aritmetica pointerilor
Exemplu: Urmtorul program arat echivalena dintre
un tablou si un pointer care l refer.
40
4. Aritmetica pointerilor
4.3. Expresii compacte cu pointeri
Cu ajutorul pointerilor se pot scrie expresii compacte n care
pointerii apar mpreun cu operatorii de incrementare ( ++ )
i decrementare ( -- ).
Astfel pot aprea urmtoarele situaii:
EXPRESIA
*p++
*p-*++p
*--p
OPERATIA
postincrementare
postdecrementare
preincrementare
predecrementare
CE SE MODIFIC
pointerul
pointerul
pointerul
pointerul
++*p
--*p
(*p)++
(*p)--
preincrementare
predecrementare
postincrementare
postdecrementare
obiectul
obiectul
obiectul
obiectul
41
4. Aritmetica pointerilor
Expresiile din prima grup modific pointerul i
nu obiectul la care se refer acesta.
Acest tip de expresii mbuntesc viteza de
execuie a unui program i se recomand utilizarea
acestora n ciclurile repetitive.
Expresiile din a doua grup modific obiectul
referit, astfel nct operatorii ++ i -- sunt
aplicai de ctre compilator asupra obiectului i
nu asupra pointerului.
Deci, nu putem utiliza n aceste expresii un pointer
la o structur, uniune sau o funcie.
Proiectarea Algoritmilor - curs
42
43
Coninutul cursului
1. Tipuri de date
2. Conceptul de pointer
3. Operatori specifici pointerilor
4. Aritmetica pointerilor
4.1. Pointeri i tablouri
4.2. Echivalene de scriere
4.3. Expresii compacte cu pointeri
44
45
46
47
48
49
50
51
52
53
Aplicatie
Se dau doua matrici. Sa se afiseze
suma matricelor. Matricele sunt alocate in
Heap.
54
2
# include <iostream.h>
55
2
void Tip_mat (int m, int n, int (*a) [10])
{
int i, j;
cout<<"Matricea rezultat\n";
for (i=0; i<m; i++)
{
for (j=0; j<n ; j++) cout <<a[i][j]<<" ";
cout<<endl;
}
}
56
57
2
int main ( )
{
int m, n, i, j, (*c)[10], (*a)[10], (*b)[10];
cout<<"m = "; cin>>m;
cout<<"n = "; cin>>n;
cout<<"Prima matrice \n";
a=(int (*) [10]) Cit_mat(m,n);
cout<<"A doua matrice\n";
b=(int (*) [10]) Cit_mat(m,n);
c=(int (*) [10]) Suma_mat(m,n,a,b);
Tip_mat(m,n,c);
}
Proiectarea Algoritmilor - curs
58
ntrebri?
59