of 17
8/7/2019 Operatii cu pointeri
1/17
Operaii cu pointeri
Operatori care se aplic asupra pointerilor
8/7/2019 Operatii cu pointeri
2/17
05.04.2011 2
Operatori specifici pointerilor
Nume Simbol Rol Utilizare
Operator derefereniere
* Definirea de tipuri dedat pointer
tip * int*
float* int**
Operator derefereniere
& Extrage adresa uneivariabile
&a
Operator dederefereniere * Acceseaz zona dememorie indicat de unpointer
*p
8/7/2019 Operatii cu pointeri
3/17
05.04.2011 3
Operatori specifici pointerilor
int* p, a, *q;int* p, a, *q;
p = &a;p = &a;
q = p;q = p;
*q = 7;*q = 7; pp100100
aa104104
qq106106
77104104 104104
8/7/2019 Operatii cu pointeri
4/17
05.04.2011 4
Atribuire
Operatorul de atribuire =
Numai ntre pointeri de acelai tip
int *p, *q;
float *r, *s;
p = q;
r = s;
p = r;
s = q;
8/7/2019 Operatii cu pointeri
5/17
05.04.2011 5
Operaii aritmetice cu pointeri
Unitate: dimensiunea zonei de memorie ctrecare indic pointerul
noiunea e definit doar pentru pointerii cu tip
int *p, a;
p = &a;
float *q, b;
q = &b;
pp100100
aa104104
pp100100
bb104104
8/7/2019 Operatii cu pointeri
6/17
05.04.2011 6
Incrementare / decrementare
Modificarea valorii operandului cu o unitate
int a, b, c, *p; aa
200200
pp
206206
bb
202202
cc
204204p = &a; 20420420
2202
p++;
p--;
8/7/2019 Operatii cu pointeri
7/17
05.04.2011 7
Incrementare / decrementare
Modificarea valorii operandului cu o unitate
float a, b, c, *p;
p = &a;
p++;
p--;
aa330000
bb330044
pp330000
cc330088
330404330088
8/7/2019 Operatii cu pointeri
8/17
05.04.2011 8
Adunarea / scderea unui numr ntreg
int a[10], *p, *q;
p = &a[0];
p + 5
q = p + 5;
p = q - 2;
pp222200
qq224224
aa200200 202202 204204 206206 210210208208 212212 214214 216216 218218
200200 210210p + 5p + 5
206206
8/7/2019 Operatii cu pointeri
9/17
05.04.2011 9
Adunarea / scderea unui numr ntreg
float a[10], *p, *q;
p = &a[0];
p + 5
q = p + 5;
p = q - 2;
pp242400
qq244244
aa200200 204204 208208 212212 220220216216 224224 228228 232232 236236
200200 220220p + 5p + 5
212212
8/7/2019 Operatii cu pointeri
10/17
05.04.2011 10
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)
8/7/2019 Operatii cu pointeri
11/17
05.04.2011 11
Alocarea dinamic a memoriei
Se include
malloc.h (Visual C)
Funcii importante
malloc
tip *p;
p = (tip*) malloc(dimensiune);
free
free(p);
8/7/2019 Operatii cu pointeri
12/17
05.04.2011 12
Alocarea dinamic a memoriei
int *p;float *q;
p = ( int* ) malloc (sizeof(int));
*p = 33;
q = ( float* ) malloc (sizeof(float));
free(p);
pp100100
qq104104
10001000
10001000
SD / SSSD / SS HeapHeap
74007400 74007400
3333
8/7/2019 Operatii cu pointeri
13/17
05.04.2011 13
Legtura dintre vectori i pointeri
int a[10];
int *p;
p = a;
a = p;
p = a + 6;
aa200200 202202 204204 206206 210210208208 212212 214214 216216
pp220220
200200200200
aa
*(a+5)*(a+5) a[5]a[5]
a+5a+5
a+5a+5*(a+5)*(a+5)
*(p+5)*(p+5) p[5]p[5]*(p+5)*(p+5)p+5p+5
p+5p+5 pp
p[0]p[0] p[2]p[2]
8/7/2019 Operatii cu pointeri
14/17
05.04.2011 14
Legtura dintre matrice i pointeri
int a[5][5];
int **p;
p = a;
0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 40 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
ppaa
p[3][2]p[3][2] *(p+3)*(p+3)p+3p+3
p+3p+3
*(*(p+3)+2)*(*(p+3)+2)
a+3a+3a[3][2]a[3][2] *(a+3)+2*(a+3)+2
a+3a+3
*(a+3)*(a+3)
*(a+3)+2*(a+3)+2
*(*(a+3)+2)*(*(a+3)+2)a[3][0]a[3][0]
???
8/7/2019 Operatii cu pointeri
15/17
05.04.2011 15
Vectori alocai dinamic
Vector dinamic
Declarare
tip* p; Alocare
p = (tip*) malloc( n * sizeof(tip));
Utilizare
p[i] Eliberare (dezalocare)
free(p);
Vector dinamic
Declarare
tip p[dim];
Alocare
-
Utilizare
p[i] Eliberare (dezalocare)
-
8/7/2019 Operatii cu pointeri
16/17
05.04.2011 16
Matrice alocate dinamic
tip **p;tip **p; //*(p+i)//*(p+i) --> adresa liniei cu indicele> adresa liniei cu indiceleii(i=0..n(i=0..n--1)1)
p = (tip**) malloc(n*sizeof(tip*));p = (tip**) malloc(n*sizeof(tip*));
for(=0;i
8/7/2019 Operatii cu pointeri
17/17
Spor la nvat!