Documente Academic
Documente Profesional
Documente Cultură
Stivă
Segment de date
Segment de cod
pointer
Zona de
memorie către
care indică
pointerul
1/6/19 3
Operatori specifici pointerilor
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
p = q;
r = s;
p = r;
s = q;
1/6/19 6
Operaţii aritmetice cu pointeri
p a
char *p, a; 100 104
p = &a;
p b
float *q, b; 100 104
q = &b;
1/6/19 7
Incrementare / decrementare
1/6/19 8
Incrementare / decrementare
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
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
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
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
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
• 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!