tipuri de date derivate - erasmus pulseinitializarea fiind identica cu cea din exemplul anterior...

Post on 27-Dec-2019

4 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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.

top related