Sunteți pe pagina 1din 13

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
Tipuri de date derivate. Tipuri predefinite. Tablouri.

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 index


pentru 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, elementele


fiind 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 valorilor


elementelor 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 sunt


initializate 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. Pointeri.

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 primul


element 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 aplica


operatiile pentru intregi, insa unitatea de modificare este
dimensiunea tipului de baza

Ex.: int *a
int b[5]={1,2,3,4,5}; // initializare vector
b[0] b[1] b[2] b[3] b[4]
a=&b;
a++;
cout << *a << endl;
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. 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; 6
int x=r; x
r++; 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; 6
int x=r; x
r++; 6

Diferenta pointer - referinta


a,r
int a=6; 6
int &r=a; P
int *p=&a; Se aloca memorie, adr
Se stocheaza adr
Tipuri de date derivate. Tipuri predefinite. Pointeri.
const Pointer vs. Pointer const
Care este diferența dintre

const int* p; int* const p;


Definește/declara un pointer la Definește/declara un pointer constant la
obiect constant obiect
=> se blochează modificarea => se blochează modificarea valorii
valorii stocate în obiect pointerului
 se poate modifica valoarea  se poate modifica valoarea stocată
pointerului în obiect

Exemplu: Exemplu:
int a[3]={1,2,3};
int a[3]={1,2,3};
int* const pv=&a[0];
const int* pv=&a[0]; pv[0]=4; // corect
pv[0]=4;// gresit, ob const pv++; // gresit, pointer const
pv++; // corect pv[2]=5; // ??
cout<<pv[1]; cout<<pv[1];

S-ar putea să vă placă și