SD - Pointeri
-
Upload
bogdan-george -
Category
Documents
-
view
215 -
download
0
Transcript of SD - Pointeri
-
7/25/2019 SD - Pointeri
1/2
Structuri de date
POINTERI
Pointerii sunt variabile a cror valoare arat zona de memorie n care se afl stocat o alt variabil.Ca orice variabil, acetia trebuie declarai nainte de a fi folosii. Modalitatea standard de a declara
un pointer este:
*; , unde tip poate fi int, double, char etc.
Tipul pointerului trebuie s fie acelai cu cel al variabilei care se afl n zona de memorie stocat n
pointer. Dac dorii s declarai mai muli pointeri pe aceeai linie, atunci nantea numelui fiecrui
pointer trebuie s punei *, altfel ca fi creat o variabil de tipul .
!ATENIE: NU putei folosi pointeri care nu au fost iniializai. Doar declararea pointerului nu nseamn
c l i iniializai. Pentru a l iniializa fie utilizai alocare dinamic(malloc), fie spunei c pointeazctre o variabil deja existent.
int *pointer1, *pointer2;
int var = 20;
pointer1 = &var; //pointer1 va pointa ctre varpointer2 = malloc (sizeof(int)); //pointer2 va pointa ctre un int*pointer2 = var; //valoarea int-ului ctre care pointeaza point2 ia valoarea lui var
Diferenadintre pointer1 i pointer2 const n faptul c, dac modificm valoarea lui var, atunci nu seva modifica dectvaloarea variabilei ctre care pointeaz pointer1.
!!! Operatorul & ntoarce adresa la care se afl stocat o variabil!!! Operatorul * n exemplul anterior se numete operator de derefereniere. Nu il confundai cusemnul * pus la declararea unui pointer. n acest caz operatorul * ntoarce valoarea variabilei ctrecare pointeaz pointerul nostru.
Dac la momentul iniializrii nu stii nc ctre ce variabil va pointa pointerul vostru va fi atunci putei
s l facei s pointeze ctre NULL. n acest fel vei aloca memorie pentru el, ns nu i vei oferi i o
variabil. Atunci cnd revenii asupra lui s i dai o valoare vei folosi malloc sau operatorul &.Avei
grij s nu folosii niciodata operatorul de derefereniere asupra unui pointer NULL. Acest lucra va
genera segmentation fault la execuie. Tot segmentation fault va fi generat i dac ncercai s lucrai
cu un pointer pe care doar l-ai declarat, fr a l i iniializa.
Funciile nu pot modifica valorile unorvariabile. Pot ns modifica valorile unor variabile dac avem
pointeri ctre acestea [chiar i aa funcia nu modific valorile pointerilor primii ca parametri]. Spre
exemplu, pentru a interschimba dou valori cu ajutorul unei funcii atunci antetul acesteia ar trebui sa
fie: void swap (int *a, int *b), urmnd ca n cadrul main s trimitem cei doi ntregi ctre funcie cu
ajutorul operatorului & : swap (&n1, &n2).
Exist posibilitatea ca o funcie s primeasc un pointer la un pointer la o variabil. Acest lucru l facem
cnd vrem s modificm valoarea pointerului la variabil. Aa cum am zis funciile nu modific valorilevariabilelor primite ca argument, i de aceea trimitem pointer la pointer.
-
7/25/2019 SD - Pointeri
2/2
Cnd avem nevoie de aa ceva? S zicem c vrem s facem o funcie care s iniializeze un vector. Un
vector este vzut de memorie ca un pointer (doar c are valoare fix). Ne dorim ca n funcia de
iniializare s putem face malloc iar rezultatul acesteia s se propage napoi n funcia din care am
apelat-o. Operaia malloc aplicat asupra unul pointer NULL modific variabila ctre pointeaz, deci
practic valoarea pointerului => e nevoie de pointer la pointer.
void init (int **a) { //dac nu am fi trimit **a am fi obinut segmentation fault*a = malloc (10*sizeof(int));
}
int main() {
int *p = NULL;
init(&p);
printf("%d %d", p[0], p[1]); //vor fi afiate dou valori random}
Situaia anterioara cu **a putea fi evitat dac n loc s facem funcia init void am fi fcut -o de tipul
int *i am fi returnat pointerul rezultat n urma malloc.
Situaia cu pointer la pointer la pointer la ... poate s continue i s conin mai multe adresri. Spre
exemplu dac doream s iniializm o matrice ntr-o funcie void atunci parametrul ar fi trebuit sa fie
***a, pentru o matrice tridimensionala ****a etc.
! ATENIE. Nu uitai c la alocarea dinamic a unei matrice trebuie s alocai prima pa ra dinamic
numrul de linii al matricei, iar apoi pentru fiecare linie (vector) s alocai din nou dinamic memorie.