C - ceea ce înseamnă "dereferencing" pointerul

Prezentare generală a terminologiei principale

Diferitele limbi de computere au notații diferite pentru a spune compilatorului sau interpretului că acum sunteți interesat de sensul specificat - mă concentrez pe C și C ++ de mai jos.







Script index

Luați în considerare în C, specificând un pointer, cum ar fi p de mai jos.

Redenumirea unui indicator

Pentru a face referire la simbolurile p pe un punct, căutăm p folosind una dintre aceste notații (din nou pentru C):

Puteți, de asemenea, să mutați indicii de-a lungul datelor indicate, jucându-le de-a lungul drumului:

Dacă aveți date care pot fi scrise, puteți face următoarele:

Identificați dereferențele și accesul la structura de date a membrilor

În C, dacă aveți o variabilă care este un pointer la o structură cu elemente de date, puteți accesa aceste elemente folosind operatorul de dereferencing:

Tipuri de date multiple

Pentru a utiliza indicatorul, programul de calculator necesită, de asemenea, o înțelegere de tipul de date pe care se face referire - în cazul în care este nevoie de mai mult de un octet pentru acest tip de date pentru prezentare, atunci indicele indică, în general octet scăzut în datele.

Deci, privind un exemplu puțin mai complex:

Afișează memoria alocată dinamic

În C ++, alocarea memoriei este efectuată de obicei folosind noul operator și se eliberează cu șterge:

Consultați și indicatorii inteligenți C ++ de mai jos.

Adesea, un indicator poate fi singurul indiciu în care unele date sau tampoane sunt stocate în memorie. Dacă aveți nevoie de utilizarea constantă a acestor date / tampon sau de posibilitatea de a apela gratuit () sau de a șterge. pentru a evita o scurgere de memorie, atunci programatorul trebuie să lucreze cu o copie a indicatorului.

sau planificați cu atenție anularea oricăror modificări.

În C ++, este mai bine să folosiți obiecte pointer inteligente pentru a stoca pointeri și pentru a le gestiona, eliberați-le automat atunci când funcționează distrugătorii pointerilor inteligenți. Deoarece biblioteca standard C ++ 11 oferă două, unique_ptr. când există un proprietar pentru obiectul selectat.

Zero indicii

În C și C ++, la fel ca tipurile numerice încorporate nu au neapărat o valoare implicită de 0. decât de la boole la false. pointerii nu sunt întotdeauna NULL. toate acestea sunt setate la 0 / false / NULL, în cazul în care acestea sunt statice sau variabile (numai C ++) membru direct sau indirect obiecte statice variabile sau a bazelor lor sau testate la zero de inițializare (de exemplu, noi T () și noul T (x , y, z), efectuați zero inițializare pe membrii T, inclusiv indicatori, în timp ce noul T; nu).







Mai strict, indicatorii inițiali stochează un model de biți care identifică fie NULL. fie (adesea virtuale).

De exemplu, int *. corect inițializate pentru a indica variabila int. poate - după turnare în float * - să acceseze valoarea din memoria "GPU", complet diferită de variabila int. și apoi, după ce apăsați K, indicatorul funcției se poate referi la o memorie separată care conține codurile de funcționare ale funcției.

Limbile de programare 3GL, cum ar fi C și C ++, tind să ascundă această complexitate, de exemplu:

Dacă compilatorul vă oferă un pointer la o variabilă sau o funcție, aveți posibilitatea să-l joace în mod liber (atâta timp cât variabila este distrusă / eliberată între timp), iar această problemă este compilatorul, cum ar fi, de exemplu. Este necesar să restaurați în avans un anumit registru al procesorului sau să utilizați o instrucțiune separată de comandă a computerului

Încercările de a muta indicii juridice dincolo de aceste limite sau atribui orice numere sau semne de indicatori legate de tipuri care nu au legătură folosite, de obicei, au un comportament nedefinit. astfel încât aceasta ar trebui evitată în biblioteci și aplicații de nivel superior, dar pentru codul OS, driverele de dispozitiv etc. Este posibil să fiți nevoit să vă bazați pe comportamentul din stânga Nedefinit folosind C sau C ++, care nu au fost determinate cu precizie de hardware-ul lor specific.

Operația de dereferențiere începe cu Pointer și urmează săgeata de mai sus Pentru a accesa pointerul. Obiectivul poate fi acela de a examina starea capului de plajă sau modificarea stării capului de plajă. operațiune indicatorul dereferire funcționează numai în cazul în care indicatorul este Pointee - punctul ar trebui să fie alocate, iar indicatorul trebuie să fie setat pentru a indica acest lucru. Cea mai frecventă greșeală din codul indicelui este să uiți să configurați elementul. Cele mai frecvente Din cauza acestei erori în cod este o operațiune de dereferencing nereușită. În Java, este greșit să Redenumiți Politic De sistemul de run-time. În limbajele compilate, cum ar fi C, C ++ și Pascal, endiancu incorect Uneori se blochează, iar alteori memoria deteriorată într-un mod subtil, casual. Erorile de eroare în limbile compilate pot fi dificil de urmărit din acest motiv.

Cu simple cuvinte, dereferencing înseamnă accesarea unei valori dintr-o locație specifică a memoriei indicată de acest pointer.

Cu toate acestea, putem dereference pointer fără a accesa valoarea la care se referă. De exemplu:

Am dereferențiat indicatorul NULL fără acces la costul acestuia. Sau am putea face:

Din nou dereferențiat, dar niciodată nu se referă la valoare. Un astfel de cod NU va eșua: Accidentul apare când accesați efectiv datele. Indicator nevalid. Cu toate acestea, din păcate, în conformitate cu dereferența standard a unui indicator nevalid este vag (cu unele excepții), chiar dacă nu încercați să atingeți datele reale.

Pe scurt, dereferentarea unui pointer înseamnă aplicarea operatorului de dereferențiere. Acest operator returnează pur și simplu o valoare L pentru utilizarea viitoare.







Articole similare

Trimiteți-le prietenilor: