Sunteți pe pagina 1din 17

Operaii cu pointeri

Operatori care se aplic asupra pointerilor

Operatori specifici pointerilor


Nume

Simbol

Rol

Utilizare

Operator de
refereniere

Definirea de tipuri de
dat pointer

Operator de
refereniere

&

Extrage adresa unei


variabile

&a

Operator de
derefereniere

Acceseaz zona de
memorie indicat de un
pointer

*p

tip *
float*

int*
int**

Operatori specifici pointerilor


int* p, a, *q;
p = &a;
q = p;
*q = 7;

p
100

104

104

a
7

106

104

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

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

a
104

100

b
104

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

a
200

b
202

c
204

p
206

202
204

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

p = &a;
300

p++;
p--;

b
304

c
308

p
300

304
08

Adunarea / scderea unui numr ntreg


int a[10], *p, *q;
p = &a[0];
a

200

202

204

206

208

210

212

214

216

p+5
q = p + 5;

p
220

p = q - 2;

q
224

200
206

210

p+5

218

Adunarea / scderea unui numr ntreg


float a[10], *p, *q;
p = &a[0];
a

200

204

208

212

216

220

224

228

232

p+5
q = p + 5;

p
240

p = q - 2;

q
244

200
212

220

p+5

236

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)

Alocarea dinamic a memoriei


Se include
malloc.h (Visual C)

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

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

p
100

33

104

1000

7400

7400

Legtura dintre vectori i pointeri


a

int a[10];
int *p;
a
200

200

202

204

206

208

210

212

214

p
220

200

p = a;
a = p;

p+5

a+5

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

p = a + 6;

p[0]

p[2]

216

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]

*(*(p+3)+2)
*(p+3)
p+3

a[3][2]

*(*(a+3)+2)
*(a+3)+2
*(a+3)
a+3

???
a[3][0]

Vectori alocai dinamic


Vector dinamic

Vector dinamic

Declarare

Declarare

tip p[dim];

Alocare
-

Utilizare
p[i]

tip* p;

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

Utilizare
p[i]

Eliberare (dezalocare) Eliberare (dezalocare)


-

free(p);

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

p+i
*(p+i)

Heap
Adresa liniei 0
Adresa liniei 1
Adresa liniei 2

Adresa liniei i

Adresa liniei n-1

*(p+i)+j

Cum se acceseaz p[i][j] ?

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

Spor la nvat!

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