Sunteți pe pagina 1din 20

Pointeri

Structura memoriei la execuia unui program


S.O. aloc o zon de memorie programului Segmente de memorie
Heap

Stiv Segment de date

Segment de cod

Segment prefix
26.05.2012 2

Tipul de dat pointer


Pointer adres de memorie
accesarea unei zone de memorie fr nume constant sau variabil cu tip sau fr tip pointer
Zona de memorie ctre care indic pointerul

Pointerul - dat static sau dinamic?


26.05.2012 3

Operatori specifici pointerilor


Nume Operator de refereniere 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 refereniere

&

Operator de derefereniere

*p

26.05.2012

Declarare i iniializare
int* p, a, *q; int *p; int a; int *q;

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

a
106

q 104

104

pointer: valoarea lui p: {float x,y;}* x; struct punct adresa lui p: void* p; zona ctre care indic p: valoarea ctre care indic p:
26.05.2012

p q p &p *p *p
5

Atribuire
Operatorul de atribuire = Numai ntre pointeri de acelai tip int *p, *q; float *r, *s; p = q; r = s; p = r; s = q;
26.05.2012 6

Operaii aritmetice cu pointeri


Unitate: dimensiunea zonei de memorie ctre care indic pointerul
noiunea e definit doar pentru pointerii cu tip

int *p, a; p = &a; float *q, b; q = &b;

p
100 104

a
100

p
104

26.05.2012

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

b
204

c
206

p 202 204

26.05.2012

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--;

26.05.2012

Adunarea / scderea unui numr ntreg


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

p = q - 2;

200 206

210

p+5

26.05.2012

10

Adunarea / scderea unui numr 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

p = q - 2;

200 212

220

p+5

26.05.2012

11

Diferena dintre doi pointeri


int a[10], *p, *q; p = &a[0];
a
200 202 204 206 208 210 212

diferena dintre q i p

qp=5

uniti
214 216 218

p+5 q = p + 5;
220

p
224

200

210

p+5

26.05.2012

12

Operatori relaionali
Toi operatorii relaionali: <, >, <=, >=, ==, != Valoarea nul pentru pointeri (pointerul nul)
NULL

Pointer nul neiniializat


Atenie: nu se poate dereferenia 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 )

26.05.2012

13

Alocarea dinamic a memoriei


Se include
malloc.h (Visual C)

Funcii importante
malloc tip *p; p = (tip*) malloc(dimensiune); free free(p);

26.05.2012

14

Alocarea dinamic a memoriei


int *p; float *q; p = ( int* ) malloc (sizeof(int)); *p = 33; q = ( float* ) malloc (sizeof(float)); free(p);

SD / SS

Heap

1000

33 p
100 104

q 7400
7400

1000

26.05.2012

15

Legtura dintre vectori i pointeri


a

int a[10]; int *p;


a 200

200

202

204

206

208

210

212

214

216

p
220

200

p+5

a+5

p = a; a = p;

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

p = a + 6;

p[0]

p[2]

26.05.2012

16

Legtura 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

int a[5][5]; int **p;


a

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]

26.05.2012

17

Vectori alocai dinamic


Vector static Vector dinamic Declarare
tip* p;

Declarare
tip p[dim];

Alocare
-

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

Utilizare
p[i] -

Utilizare
p[i] free(p);

Eliberare (dezalocare) Eliberare (dezalocare)

26.05.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(=0;i<n;i++) p[i] = (tip*) malloc(m*sizeof(tip)); SD / SS


p Adresa liniei 0 Adresa liniei 1 Adresa liniei 2

Heap

0 1 2

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]?


26.05.2012

Spor la nvat!

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