SD - Pointeri

download SD - Pointeri

of 2

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.