Sunteți pe pagina 1din 20

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 adrese


mici
1/6/19 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

1/6/19 3
Operatori specifici pointerilor

Nume Simbol Rol Utilizare


Operator de * Definirea de tipuri de tip* int*
referenţiere dată pointer float* int**
void*

Operator de & “Extrage” adresa unei &a


referenţiere variabile

Operator de * Accesează zona de *p


dereferenţiere memorie indicată de un
pointer

1/6/19 4
Declarare și inițializare
int* p, a, *q;  int *p; int a; int *q;
p = &a;
q = p;
*q = 7; p a q
100 104 108

104 7 104

pointer: p q
struct lui
valoarea punct
p: {float x,y;}* x; p
adresa
void*luip;p: &p
zona către care indică p: *p
valoarea către care indică p: *p
1/6/19 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;

1/6/19 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

p a
char *p, a; 100 104
p = &a;

p b
float *q, b; 100 104

q = &b;

1/6/19 7
Incrementare / decrementare

• Modificarea valorii operandului cu o unitate

short int a, b, c, *p; a b c p


200 202 204 206
p = &b; 202
204
p++;
p--;

1/6/19 8
Incrementare / decrementare

• Modificarea valorii operandului cu o unitate

float a, b, c, *p;
p = &b; a b c p
300 304 308 300
p++; 308
304
p--;

1/6/19 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;
p q
220 224
p = q - 2; 200
206 210
p+5

1/6/19 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;
p q
240 244
p = q - 2; 200
212 220
p+5

1/6/19 11
Diferența dintre doi pointeri diferența
dintre q și p
short int a[10], *p, *q; q–p=5
p = &a[0]; unități
a
200 202 204 206 208 210 212 214 216 218
p+5

q = p + 5;
p q
220 224

200 210
p+5

1/6/19 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 )

1/6/19 13
Alocarea dinamică a memoriei

• Se include
malloc.h (Visual C)

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

1/6/19 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 q
100 104

1000 7400 7400

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

218 p
a
p+5 a+5 p
200 200
p = a;
a = p;
a+5  a[5]
*(a+5)
p+5  p[5]
*(p+5)
p = a + 6;
p[0] p[2]

1/6/19 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;
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)) a[3][0]

1/6/19 17
Vectori alocaţi dinamic

Vector static Vector dinamic

• Declarare • Declarare
tip p[dim]; int n,i; tip* p; int n,i;
• Alocare • Alocare
- p = (tip*) malloc( n * sizeof(tip));
• Utilizare • Utilizare
p[i] p[i]
• Eliberare (dezalocare) • Eliberare (dezalocare)
- free(p);

1/6/19 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 Heap

Adresa liniei 0
p Adresa liniei 1
Adresa liniei 2 0 1 2 … j … m-1

Adresa liniei i

p+i Adresa liniei n-1

*(p+i) *(p+i)+j
Cum se accesează [i][j]? *(*(p+i)+j) p[i][j]

1/6/19 19
Spor la învăţat!

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