Pointeri

Structura memoriei la execuția unui program
• S.O. alocă o zonă de memorie programului • Segmente de memorie adrese
Heap

mari

Stivă Segment de date

Segment de cod

Segment prefix
14.12.2012

adrese mici
2

Tipul de dată pointer
• Pointer  adresă de memorie
• accesarea unei zone de memorie fără ”nume” • constantă sau variabilă • cu tip sau fără tip pointer
Zona de memorie către care indică pointerul

• Pointerul - dată statică sau dinamică?
14.12.2012 3

Operatori specifici pointerilor
Nume Operator de referenţiere Simbol * Rol Definirea de tipuri de dată pointer “Extrage” adresa unei variabile Accesează zona de memorie indicată de un pointer Utilizare tip* float* void* int* int** &a

Operator de referenţiere

&

Operator de dereferenţiere

*

*p

14.12.2012

4

Declarare și inițializare
int* p, a, *q;  int *p; int a; int *q;

p = &a;
q = p; *q = 7; p
100 104

a
108

q 104

104

7

pointer: valoarea lui p: {float x,y;}* x; struct punct adresa lui p: void* p; zona către care indică p: valoarea către care indică p:
14.12.2012

p q p &p *p *p
5

Atribuire
• Operatorul de atribuire = • Numai între pointeri de acelaşi tip int *p, *q; float *r, *s; p = q; r = s; p = r; s = q;
14.12.2012 6

Operaţii aritmetice cu pointeri
• Unitate: dimensiunea zonei de memorie către care indică pointerul (depinde de tip)
– noţiunea e definită doar pentru pointerii cu tip

char *p, a; p = &a;

p
100 104

a

p

b
104

float *q, b; q = &b;
14.12.2012

100

7

Incrementare / decrementare
• Modificarea valorii operandului cu o unitate short int a, b, c, *p; p = &b; p++; p--;
a
200 202

b
204

c
206

p 202 204

14.12.2012

8

Incrementare / decrementare
• Modificarea valorii operandului cu o unitate float a, b, c, *p; p = &b;
300

a
304

b
308

c
300

p 308 304

p++; p--;

14.12.2012

9

Adunarea / scăderea unui număr întreg
short int a[10], *p, *q; p = &a[0];
a
200 202 204 206 208 210 212 214 216 218

p+5 q = p + 5;
220

p
224

q

p = q - 2;

200 206

210

p+5

14.12.2012

10

Adunarea / scăderea unui număr întreg
float a[10], *p, *q; p = &a[0];
a
200 204 208 212 216 220 224 228 232 236

p+5 q = p + 5;
240

p
244

q

p = q - 2;

200 212

220

p+5

14.12.2012

11

Diferența dintre doi pointeri
short int a[10], *p, *q; p = &a[0];
a
200 202 204 206 208 210 212

diferența dintre q și p

q–p=5

unități
214 216 218

p+5 q = p + 5;
220

p
224

q

200

210

p+5

14.12.2012

12

Operatori relaţionali
• Toţi operatorii relaţionali: <, >, <=, >=, ==, != • Valoarea nulă pentru pointeri (pointerul nul)
NULL

• Pointer nul  neiniţializat
– Atenţie: nu se poate dereferenţia un pointer nul!
int *p; … if( p == NULL ) //nul, nu se poate lucra cu el else //nenul, poate fi accesată zona indicată de el if( !p )

14.12.2012

13

Alocarea dinamică a memoriei
• Se include
malloc.h (Visual C)

• Funcţii importante
• malloc tip *p; p = (tip*) malloc(dimensiune); • free free(p);

14.12.2012

14

Alocarea dinamică a memoriei
short int *p; float *q; p = ( short int* ) malloc (sizeof(short int)); *p = 33; q = ( float* ) malloc (sizeof(float)); free(p);

SD / SS

Heap

1000

33 p
100 104

q 7400
7400

1000

14.12.2012

15

Legătura dintre vectori şi pointeri
a
short int a[10]; short int *p;
200 202 204 206 208 210 212 214 216

a 200

218

p
200 p+5 a+5 p

p = a; a = p;

a+5 *(a+5)  a[5] p+5 *(p+5)  p[5]

p = a + 6;

p[0]

p[2]

14.12.2012

16

Legătura dintre matrice şi pointeri
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 short int a[5][5]; short int **p;

a

p

p+3

a+3 *(a+3)+2

p = a;
p[3][2] a[3][2] *(*(p+3)+2) *(p+3) p+3 *(*(a+3)+2) *(a+3)+2 *(a+3) a+3 ??? *(*(a+3)) a[3][0]

14.12.2012

17

Vectori alocaţi dinamic
Vector static Vector dinamic • Declarare
tip* p; int n,i;

• Declarare
tip p[dim]; int n,i;

• Alocare
-

• Alocare
p = (tip*) malloc( n * sizeof(tip));

• Utilizare
p[i] -

• Utilizare
p[i] free(p);

• Eliberare (dezalocare) • Eliberare (dezalocare)

14.12.2012

18

Matrice alocate dinamic
tip **p;
//*(p+i) -> adresa liniei cu indicele i (i=0..n-1)

p = (tip**) malloc(n*sizeof(tip*)); for(i=0;i<n;i++) for(i=0;i<n;i++) free(p[i]); p[i] = (tip*) malloc(m*sizeof(tip)); free(p); SD / SS
p Adresa liniei 0 Adresa liniei 1 Adresa liniei 2 …

Heap

0 1 2

j

m-1

p+i
*(p+i)

Adresa liniei i … Adresa liniei n-1

*(p+i)+j *(*(p+i)+j) p[i][j]
19

Cum se accesează [i][j]?
14.12.2012

Spor la învăţat!