Pointeri. Ce sunt pointerii?

Pointerul este o variabilă care conține o adresă de memorie. Această variabilă conține adresa unei variabile. Avantajele utilizării pointerilor sunt:

  • oferă posibilitatea de a modifica argumentele de apelare a funcțiilor;
  • permit o alocare dinamică a memoriei;
  • pot îmbunătăți eficiența anumitor rutine.

Pointerii sunt, în esență, una dintre cele mai puternice caracteristici ale limbajului C, dar și periculoase. Dacă pointerii nu sunt inițializați corect sau dacă conțin valori incorecte pot determina blocarea calculatorului sau să conducă la erori greu de depistat.

Dacă o variantă urmează să conțină un pointer (o adresă), aceasta trebuie declarată astfel: tip *nume, unde:

  • tip este tipul de bază al pointerului, specifică tipul obiectului pe care pointerul îl poate indica;
  • nume este nume variabilei de tip pointer;
  • * – asterix, operatorul de indirectare

Exemplu:

// declarație variabile
int x = 17, y = 3;
// declarație pointer 
int *p;

Operatorii folosiți în cazul pointerilor sunt & și *. Operatorul & („adresa lui”) returnează adresa de memorie a variabilei pe care o precede.

p=&x; //px conține adresa lui x

Operatorul * („de la adresa”) returnează valoarea de la adresa pe care o precede.

y=*p //dacă p este adresa lui x, y devine egal cu x, adică cu ceste la adresa p*

Este important ca variabilele de tip pointer să indice întotdeauna corect tipul de date. De exemplu, dacă se declară un pointer de tip int, compilatorul înțelege că la adresa pe care o conține pointerul va fi memorat o variabilă de tip întreg, și nu alt tip.

Fie programul următor:

 #include<iostream>
using namespace std;
int main()
{
    int *p;
    float a,b;
    p=&a; //*greșit, p idică un întreg, iar a este real în virgulă mobilă
    b=*p;
    return 0;
}
}

Observație! Compilatorul nu dă mesaj de eroare (eventual avertisment), deși pointerul p de tip întreg i se atribuie adresa unui float (a). În final, lui b nu i se atribuie valoarea lui a. Pointerul p fiind de tip întreg, vor fi transferați în b doar doi octeți, nu toți cei patru care formează în mod normal un număr float.


Valoarea unei variabile poate fi referită printr-un pointer, proces numit indirectare. Operatorul * folosit în partea stângă a unei instrucțiuni de asignare pentru a atribui o nouă valoare folosind un pointer.

#include<iostream>
using namespace std;
int main()
{
    int a, *b;
    a=55;  //a primește valoarea 55
    b=&a; //b primește adresa lui a
    *b=135 //asignează lui valoarea 135 folosind pointerul b
    //Cu alte cuvinte, la adresa lui a se pune valoarea 135.
    cout<<"Valoarea finala a lui a este"<<a;
    return 0;
}
}

Programul asignează, în mod indirect, folosind pointerul b, lui a valoarea 135. Programul va afișa:

Valoarea finala a lui a este 135

Operațiile permise asupra pointerilor sunt următoarele:
• extragerea obiectului referit de către pointer folosind operatorul * sau operatorul []
• extragerea adresei unui pointer folosind operatorul & (se va obține un pointer la pointer)
• atribuirea intre doi pointeri care refera același tip de data
• incrementarea/decrementarea (va muta pointerul înainte/înapoi cu un număr de bytes egal cu dimensiunea tipului referit)
• adunarea/scăderea cu o valoare întreagă (va muta pointerul înainte/înapoi cu un număr de bytes egal cu dimensiunea tipului referit înmulțită cu valoarea întreagă)
• diferența a doi pointeri de același tip (se obține numărul de elemente de tipul respectiv ce încap intre cei doi pointeri)
• compararea a doi pointeri
• conversia pointerilor (se realizează ca și pentru celelalte tipuri folosind operatorul de cast)

De asemenea, ai putea dori...

Lasă un răspuns

Acest sit folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.