Sunteți pe pagina 1din 20

Pointeri

Structura memoriei la execuia 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
10.06.2013

adrese mici
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?


10.06.2013 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

10.06.2013

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

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

a
108

q 104

104

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

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

Operaii aritmetice cu pointeri


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

char *p, a; p = &a;

p
100 104

b
104

float *q, b; q = &b;


10.06.2013

100

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

10.06.2013

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

10.06.2013

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

p = q - 2;

200 206

210

p+5

10.06.2013

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

10.06.2013

11

Diferena dintre doi pointeri


short 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

10.06.2013

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 )

10.06.2013

13

Alocarea dinamic a memoriei


Se include
malloc.h (Visual C)

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

10.06.2013

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

10.06.2013

15

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

10.06.2013

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 short int a[5][5]; short int **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]

10.06.2013

17

Vectori alocai 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)

10.06.2013

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

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


10.06.2013

Spor la nvat!