Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
Tipuri de date derivate
• Tipuri predefinite: tipuri de date la care utilizatorul poate stabili
numai anumiti parametrii (dimeniuni, tip de baza, etc); modul de
organizare al datelor fiind predefinit.
– Tablouri
– ointeri
– Referinte
• Tipuri definite de utilizator: tipuri de date la care utilizatorul
stabileste toate detaliu de implementare: continutul, organizarea
datelor, etc.
– Structuri
– Uniuni
– Clase
Tablouri (array)
= colectie de obiecte avand acelasi tip de date, organizate dupa un rastru (grid) n dimensional.
- Apelarea elementelor se face prin intermediul indecsilor, un indexpentru fiecare dimensiune (axa de indexare)
- Indexarea elementelor se face de la 0…dim-1
Sintaxa definitie: Tip_date nume_tablou[dim1][dim2]…
in care dim1, dim2… sunt constante intregi
Ex.: int a[2][3];
Tipuri de date derivate. Tipuri predefinite. Tablouri.
Alocarea memorie
Indiferent de numarul de dimensiuni, în cazul alocarii statice:
tablourile sunt alocate in spatiu de memorie compact, elementelefiind parcurse prin liniarizare, variind indecsii dimensiunilor de la
dreapta (exterior) catre stanga (nume_tablou)
Ex.: int a[2][3][4];
In memorie, elementele sunt asezate la adrese succesive (la rand) in ordinea:
a[0][0][0],a[0][0][1],a[0][0][2],a[0][0][3],a[0][1][0],a[0][1][1],
a[0][1][2],a[0][1][3],a[0][2][0],a[0][2][1],a[0][2][3],a[1][0][0],
a[1][0][1],a[1][0][2],a[1][0][3],a[1][1][0],a[1][1][1],a[1][1][2],
a[1][1][3],a[1][2][0],a[1][2][1],a[1][2][3]
Tipuri de date derivate. Tipuri predefinite. Tablouri.
Initializare tablouri
Un tablou nu se intializeaza implicit la definitie (conform sintaxei date anterior). Intr-o astfel de situaltie valorile stocate sunt aleatoare(conform initializarii memoriei la pornirea calculatorului)
Un tablou se poate initializa la definitie prin insiruirea valorilorelementelor sale, conform sintaxei:
TipData NumeTablou[dim1][dim2][...]=
{{val01,val02,..},{val10,val11,..},{...}..};
Ex.: int a[2][3]={{1,2,3},{4,5,6}};
Tema: sa se initializeze tabloul: int a[2][3][4];
Tipuri de date derivate. Tipuri predefinite. Tablouri.
Initializare tablouri
Se mai poate initializa un tablou prin insiruirea valorilor, fara a tine seama de indexari, ordinea in care se asociaza valorilor fiind cea in care sunt stocate elementele in memoria calculatorului:
Ex.: int a[2][3]={1,2,3,4,5,6};
Initializarea fiind identica cu cea din exemplul anterior
Daca la initilizare nu sunt date toate elementele, atunci restul suntinitializate implicit cu zero
int a[2][3]={0}; Reprezinta un tablou initializat tot cu 0
Tipuri de date derivate. Tipuri predefinite. Tablouri.
Sirurile de caractere
= caz particular de tablou cu 1 dimensiune, cu tip de baza char
Dimensiunea trebuie sa fie mai mare cu 1 decat cea dorita, pentru stocarea terminatorului de sir ‘\0’
Tipuri de date derivate. Tipuri predefinite. Tablouri.
Pointeri
= variabila in care se poate stoca adresa unei zone de memorie;
tipul variabilei stocate la respectiva adresa se numeste tip de baza al pointerului.
Sintaxa, operatori: int *a //declaratie/definitie pointer int b;
a=&b; //operator de referentiere (adresare) b=*a; //operator de dereferentiere (indirectare)
Obs.: Numele unui tablou este pointer constant (adresa) la primulelement al tabloului.
Tipuri de date derivate. Tipuri predefinite. Pointeri.
Obs.: void *nume este pointer fara tip de baza (se poate stoca o
adresa, insa nu se stie tipul variabilei stocate acolo; nu . functioneaza artimetica pointerilor); se poate folosi numai prin
conversie la un tip concret de date
Tipuri de date derivate. Tipuri predefinite. Pointeri.
Aritmetica pointerilor: in general asupra pointerilor se pot aplicaoperatiile pentru intregi, insa unitatea de modificare estedimensiunea tipului de baza
Ex.: int *a
int b[5]={1,2,3,4,5}; // initializare vector
a=&b;
a++;
cout << *a << endl;
b [ 0 ] b [ 1 ] b [ 2 ] b [ 3 ] b [ 4 ]
Tipuri de date derivate. Tipuri predefinite. Pointeri.
Alocarea / dealocare memoriei:
• Ca in C folosind functiile malloc , respectiv free
• In C++ exista operatori proprii: new, respectiv delete
pentru alocare multipla (vector) eliberarea spatiului se face cu operatorul delete[]
Sintaxa: numePointer = new tipBaza; delete numePointer;
pentru vectori: numePointer = new tipBaza[dim]; delete[] numePointer;
Ex.: int *a, *b;
a=new int; // alocare memorie pentru un singur obiect
b=new int[5]; // alocare memorie pentru mai multe obiecte
delete a; // eliberare memorie pentru un singur obiect
delete[] b;//eliberare memorie pentru mai multe obiecte alocate
Tipuri de date derivate. Tipuri predefinite. Pointeri.
Referinte
= nume alternativ asociat unui obiect deja existent
Obs.: cum nu poate exisa un nume fara variabila asociata, orice referinta trebuie initializata la declarare
Sintaxa: TipDate & nume=varInit;
Ex.: int a=6; a,r
int &r=a;
int x=r; x
r++;
6
6
Tipuri de date derivate. Tipuri predefinite. Referinte.
Referinte
= nume alternativ asociat unui obiect deja existent Obs.: cum nu poate exisa un nume fara variabila asociata,
orice referinta trebuie initializata la declarare
Sintaxa: TipDate & nume=varInit;
Ex.: int a=6; a,r
int &r=a;
int x=r; x
r++;
Diferenta pointer - referintaa,r
int a=6;
int &r=a; P
int *p=&a;
6
6
6
adrSe aloca memorie,Se stocheaza adr
Tipuri de date derivate. Tipuri predefinite. Referinte.
Care este diferența dintre
const int* p;
Definește/declara un pointer la obiect constant
=> se blochează modificarea valorii stocate în obiect
se poate modifica valoareapointerului
Exemplu:int a[3]={1,2,3};
const int* pv=&a[0];
pv[0]=4;// gresit, ob const
pv++; // corect
cout<<pv[1];
const Pointer vs. Pointer const
int* const p;
Definește/declara un pointer constant la obiect
=> se blochează modificarea valorii pointerului
se poate modifica valoarea stocată în obiect
Exemplu:int a[3]={1,2,3};
int* const pv=&a[0];
pv[0]=4; // corect
pv++; // gresit, pointer const
pv[2]=5; // ??
cout<<pv[1];
Tipuri de date derivate. Tipuri predefinite. Pointeri.