Salut,
astazi voi incerca sa lamuresc cateva aspecte legate de pointeri.
Ei bine, un pointer este practic o variabila care retine o adresa de memorie (adresa unei date, adresa unei functii, adresa unei adrese din memorie, void - adresa catre o zona necunoscuta).
Exista doi operatori esentiali pe care ii vom folosim: * (dereferentiere) si & (referentiere) si apar in fata variabilei de tip pointer.
Acum o sa ma intrebati ce inseamna derefentiere si referentiere...
Este destul de simplu, * este folosit atunci cand dorim sa aflam valoarea stocata la adresa respectiva. Atunci cand este folosit la declararea unei variabile, acesta indica prezenta unui pointer la tipul respectiv.
Cu ajutorul lui & putem afla adresa din memorie a variabilei respective (si l-am si folosit deja la functia scanf).
Trebuie sa retinem faptul ca un pointer nu este alocat la definire. Va trebui ca noi sa facem asta si vom vedea cum putin mai tarziu.
Exemple:
int *a; // pointer la int sau vector de intregi
int b = 10; // variabila de tip int
char *c; // pointer la char sau sir de caractere (vector de caractere)
void *s = NULL; // initializare la null (valoare 0)
*a = 5; // initializare gresita, a nu a fost alocat si nu indica nicio adresa
a = &b; // initializare corecta, a indica acum adresa lui b
*a = 5; // initializare corecta, echivalenta cu b = 5
Dupa cum am spus deja, declaratia int *a este echivalenta cu int a[] deci putem declara vectori cu ajutorul pointerilor, cu conditia de a face, ulterior, alocarea memoriei. Pentru ca tot veni vorba de asta, exista 2 functii de baza care ne ajuta malloc si calloc. Ele se utilizeaza in modul urmator:
int *a;
// vom aloca un vector de 100 de elemente intregi
a = (int*)malloc(100 * sizeof(int));
a = (int*)calloc(100, sizeof(int));
Diferenta dintre cele doua este ca calloc face si initializarea componentelor la zero.
Important! De fiecare data cand folosim functiile de alocare a memoriei este fundamental sa o eliberam la finalul programului. Pentru aceasta exista functie free.
Multi se sperie de pointeri si gasesc acest lucru gresit. Daca sunt folositi corect, acestia fac minuni. Este foarte adevarat ca pot aparea si efecte secundare daca doi pointeri arata catre acelasi continut de memorie (cum am vazut in exemplul de mai sus), insa intotdeauna trebuie sa folosim pointerii cu atentie.
Cineva mi-a povestit odata cum vede el un pointer si a facut o analogie cu un ogar care indica spre prada de vanatoare (asa ca in desenele animate :) ). Evident cainele este variabila de tip pointer, iar prada este continutul/adresa din memorie.
Consider ca este de ajuns pentru astazi. Data viitoare vom vedea cum se folosesc acesti pointeri in probleme cu vectori. Pana atunci eu va doresc numai bine.
No comments:
Post a Comment