Pointer (programare)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În programare , pointerele sunt tipuri de date care reprezintă poziția (folosind adrese de memorie ) a elementelor programului precum variabile , obiecte , structuri de date , subrutine .

Descriere

Tipuri de indicatori

În limbile tastate , fiecare pointer are un tip bine definit, derivată din tipul obiectului ascuțit. Astfel, adresa memoriei unei variabile de tip „întreg” se va spune că este de tip „pointer to integer”, iar acest lucru va fi considerat de limbă ca un tip distinct de „pointer to character” sau alte tipuri de pointer. Tipul obiectului indicat este adesea denumit tipul de bază al indicatorului (cu o terminologie similară cu cea utilizată pentru tablouri ). Tipurile de pointer pot fi utilizate și în declararea variabilelor (sau în alte contexte similare). De exemplu, în limbajul C.

 int n ;
 char c ;

declară n ca o variabilă de tip int (întreg) și c ca char (caracter);

 int * pn ;
 char * pc ;

declară pn ca „pointer to integer” și pc ca „pointer to character”. Aceste două tipuri sunt considerate de limbă ca fiind distincte și (cel puțin în principiu), incompatibil [ nu este clar ] ; o misiune de genul

 pc = pn ;

acesta va fi raportat de compilator ca o eroare .

Indicator nul

Fiecare limbă oferă o valoare specială care poate fi atribuită unei variabile de tip pointer pentru a indica faptul că nu indică niciun obiect. Această valoare este în general denumită NULL (NULL) și deseori corespunde valorii „0” (care nu reprezintă de obicei o adresă de memorie validă).

Pointeri nevalizi

Pentru „pointer nevalid” vom însemna în general o variabilă de tip pointer neinițializată sau căreia nu i s-a atribuit niciodată adresa vreunui obiect. În funcție de limbi și contexte, aceasta poate duce la variabila care conține fie o valoare „aleatorie”, fie o valoare nulă .

Dereferențierea unui indicator „invalid” duce adesea la o eroare de sistem sau la o excepție . În cel mai rău caz (cel în care indicatorul conține o valoare „aleatorie” care, totuși, în mod fortuit, corespunde unei locații de memorie), ar putea duce la o încălcare gravă a coerenței interne a memoriei programului, cu imprevizibil și adesea dezastruos rezultate. Din acest motiv, utilizarea incorectă a indicatorilor poate duce la disfuncționalități ale căror cauze sunt foarte greu de identificat și corectat . Unele limbi încearcă să limiteze utilizarea de indicatori sau chiar să le elimine complet (un exemplu în acest sens este Java ); eliminarea pointerilor trebuie să corespundă în general introducerii altor mecanisme care permit obținerea unor rezultate similare cu cele pentru care pointerii sunt de obicei folosiți (limitările impuse de Java asupra utilizării pointerilor, de exemplu, sunt contrabalansate de mecanismul său de colectare a gunoiului ) .

Operații pe pointeri

Un exemplu grafic de operații de atribuire a indicatorului

Operația fundamentală care poate fi efectuată pe o valoare de tip pointer se numește dereferențierea (dereferențierea) sau operația rezoluției de referință; este reprezentat de un operator unar care, atunci când este aplicat unui pointer, produce obiectul arătat ca rezultat. Astfel, cu referire la exemplul secțiunii anterioare,

 * pn = 3 ;

(„*” este simbolul operatorului de dereferențiere), atribuie „3” variabilei întregi indicată de pn .

O altă operațiune destul de comună referitoare la pointeri (care nu este furnizată de toate limbile) permite obținerea unui pointer către o variabilă dată sau calcularea adresei acesteia; operatorul corespunzător (de asemenea, unar) este adesea denumit „adresa operatorului”. În C și C ++ acest operator este reprezentat de simbolul "&":

 pn = & n ;

atribuie adresa variabilei n cursorului pn . Atâta timp cât pn deține această valoare, orice utilizare a indicatorului dereferențiat, cum ar fi

 * pn = 4 ;

va afecta variabila n indicată de pn .

Unele limbi (în special din familia C ) oferă un set suplimentar de operații de tip pointer pe valori, special concepute pentru navigarea în matrice ; acestea sunt denumite aritmetică a indicatorului .

Pointerii pot fi folosiți și pentru a apela funcții, caz în care sunt denumiți pointeri de funcții . Să presupunem că avem 2 funcții:

 int f1 ( dublu );
 int f2 ( dublu );

atunci puteți crea un pointer funcțional ca acesta:

 int ( * pfunz ) ( dublu );

În acest moment, puteți decide să indicați indicatorul pfunz fie către prima funcție f1, fie spre a doua funcție f2:

 dacă ( condiție )
     pfunz = f1 ;
 altceva
     pfunz = f2 ;

Pentru a invoca funcția, trebuie doar să derecați indicatorul:

 int res = * pfunz ( 4.2 );

Întregul mecanism este valabil numai dacă funcțiile au același tip de returnare și același număr de parametri de același tip.

Aplicații

Utilizarea indicatoarelor este adesea necesară pentru a construi structuri dinamice de date (cu formă imprevizibilă și / sau variabilă în timp), cum ar fi grafice , arbori , liste și așa mai departe.

O altă aplicație clasică a pointerilor este de a simula parametrii de trecere prin referință în acele limbi care au doar parametrii care trec prin valoare .

Mecanisme conexe

  • Limbajul C ++ oferă doi constructori de tip înrudit; indicatorul în sens strict și referința , un tip special de indicator cu dereferențierea implicită.
  • Java oferă un concept similar cu cel al unui pointer (numit și referință ), cu funcționalitate limitată.

Elemente conexe

Alte proiecte

Controlul autorității GND ( DE ) 4285887-2