C ++ Pointer cu exemple

Cuprins:

Anonim

Ce sunt indicii?

În C ++, un pointer se referă la o variabilă care deține adresa unei alte variabile. La fel ca variabilele obișnuite, indicii au un tip de date. De exemplu, un pointer de tip întreg poate conține adresa unei variabile de tip întreg. Un pointer de tip caracter poate conține adresa unei variabile de tip caracter.

Ar trebui să vedeți un indicator ca o reprezentare simbolică a unei adrese de memorie. Cu ajutorul indicatoarelor, programele pot simula apel prin referință. De asemenea, pot crea și manipula structuri dinamice de date. În C ++, o variabilă pointer se referă la o variabilă care indică o adresă specifică dintr-o memorie indicată de o altă variabilă.

În acest tutorial C ++, veți învăța:

  • Ce sunt indicii?
  • Adrese în C ++
  • Sintaxa declarației indicatorului
  • Operator de referință (&) și operator de deferență (*)
  • Pointeri și matrice
  • Pointer NULL
  • Indicatori de variabile
  • Aplicarea indicatoarelor
  • Avantajele utilizării pointerelor

Adrese în C ++

Pentru a înțelege indicii C ++, trebuie să înțelegeți modul în care computerele stochează date.

Când creați o variabilă în programul dvs. C ++, i se alocă un spațiu în memoria computerului. Valoarea acestei variabile este stocată în locația atribuită.

Pentru a cunoaște locația din memoria computerului în care sunt stocate datele, C ++ oferă operatorului & (de referință). Operatorul returnează adresa pe care o variabilă o ocupă.

De exemplu, dacă x este o variabilă, & x returnează adresa variabilei.

Sintaxa declarației indicatorului

Declarația de C ++ are următoarea sintaxă:

datatype *variable_name;
  • Tipul de date este tipul de bază al indicatorului care trebuie să fie un tip de date C ++ valid.
  • Numele_variabilă este ar trebui să fie numele variabilei pointer.
  • Asteriscul folosit mai sus pentru declararea indicatorului este similar cu asteriscul folosit pentru a efectua operația de multiplicare. Este asteriscul care marchează variabila ca un pointer.

Iată un exemplu de declarații de pointer valabile în C ++:

int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character

Operator de referință (&) și operator de deferență (*)

Operatorul de referință (&) returnează adresa variabilei.

Operatorul de dereferență (*) ne ajută să obținem valoarea stocată într-o adresă de memorie.

De exemplu:

Dacă avem o variabilă numită num, stocată în adresa 0x234 și stocând valoarea 28.

Operatorul de referință (&) va returna 0x234.

Operatorul de dereferență (*) va returna 5.

Exemplul 1:

#include using namespace std;int main() {int x = 27;int *ip;ip = &x;cout << "Value of x is : ";cout << x << endl;cout << "Value of ip is : ";cout << ip<< endl;cout << "Value of *ip is : ";cout << *ip << endl;return 0;}

Ieșire:

Cum funcționează acest lucru:

Iată o captură de ecran a codului:

Explicatie cod:

  1. Importați fișierul antet iostream. Aceasta ne va permite să folosim funcțiile definite în fișierul antet fără a primi erori.
  2. Includeți spațiul de nume std pentru a-i folosi clasele fără a-l apela.
  3. Apelați funcția main (). Logica programului trebuie adăugată în corpul acestei funcții. {Marchează începutul corpului funcției.
  4. Declarați o variabilă întreagă x și atribuiți-i o valoare de 27.
  5. Declarați o variabilă pointer * ip.
  6. Stocați adresa variabilei x în variabila pointer.
  7. Imprimați un text pe consolă.
  8. Imprimați valoarea variabilei x pe ecran.
  9. Imprimați un text pe consolă.
  10. Imprimați adresa variabilei x. Valoarea adresei a fost stocată în variabila ip.
  11. Imprimați un text pe consolă.
  12. Valoarea de imprimare a memorat la adresa indicatorului.
  13. Programul ar trebui să returneze valoare la executarea cu succes.
  14. Sfârșitul corpului funcției main ().

Pointeri și matrice

Tablourile și indicatoarele funcționează pe baza unui concept asociat. Există lucruri diferite de remarcat atunci când lucrați cu tablouri care au indicii. Numele matricii în sine indică adresa de bază a matricei. Acest lucru înseamnă că pentru a atribui adresa unui tablou unui pointer, nu ar trebui să utilizați un ampersand (&).

De exemplu:

p = arr;

Cele de mai sus sunt corecte, deoarece arr reprezintă adresa matricelor. Iată un alt exemplu:

p = &arr;

Cele de mai sus sunt incorecte.

Putem converti implicit o matrice într-un pointer. De exemplu:

int arr [20];int * ip;

Mai jos este o operațiune validă:

ip = arr;

După declarația de mai sus, ip și arr vor fi echivalente și vor partaja proprietăți. Cu toate acestea, o adresă diferită poate fi atribuită ip, dar nu putem atribui nimic ar.

Exemplul 2:

Acest exemplu arată cum să traversați o matrice folosind pointeri:

#include using namespace std;int main() {int *ip;int arr[] = { 10, 34, 13, 76, 5, 46 };ip = arr;for (int x = 0; x < 6; x++) {cout << *ip << endl;ip++;}return 0;}

Ieșire:

Iată o captură de ecran a codului:

Explicatie cod:

  1. Declarați o variabilă pointer de număr întreg ip.
  2. Declarați o matrice numită arr și stocați 6 numere întregi în ea.
  3. Atribuiți arr la ip. IP și arr vor deveni echivalente.
  4. Creați un pentru o buclă. Variabila buclă x a fost creată pentru a itera peste elementele matricei de la indexul 0 la 5.
  5. Imprimați valorile stocate la adresa IP a indicatorului. O valoare va fi returnată pe iterație și se vor efectua în total 6 repetări. Endl este un cuvânt cheie C ++ care înseamnă linia finală. Această acțiune vă permite să mutați cursorul pe linia următoare după imprimarea fiecărei valori. Fiecare valoare va fi tipărită într-o linie individuală.
  6. Pentru a muta indicatorul la următoarea poziție int după fiecare iterație.
  7. Sfârșitul buclei pentru.
  8. Programul trebuie să returneze ceva după executarea cu succes.
  9. Sfârșitul corpului funcției principale ().

Pointer NULL

Dacă nu există o adresă exactă care urmează să fie atribuită, variabilei pointer i se poate atribui un NULL. Ar trebui să se facă în timpul declarației. Un astfel de indicator este cunoscut ca un indicator nul. Valoarea sa este zero și este definită în multe biblioteci standard precum iostream.

Exemplul 3:

#include using namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}

Ieșire:

Iată o captură de ecran a codului:

Explicatie cod:

  1. Declarați o variabilă pointer ip și atribuiți-i o valoare NULL.
  2. Valoarea de imprimare a variabilei pointer ip alături de un text de pe consolă.
  3. Programul trebuie să returneze valoarea la finalizarea cu succes.
  4. Sfârșitul corpului funcției main ().

Indicatori de variabile

Cu C ++, puteți manipula datele direct din memoria computerului.

Spațiul de memorie poate fi atribuit sau realocat după cum doriți. Acest lucru este posibil prin variabilele Pointer.

Variabilele indicatorului indică o adresă specifică din memoria computerului indicată de o altă variabilă.

Poate fi declarat după cum urmează:

int *p;

Sau,

int* p;

În exemplul dvs., am declarat variabila pointer p.

Va conține o adresă de memorie.

Asteriscul este operatorul de dereferință care înseamnă un pointer către.

Indicatorul p indică o valoare întreagă în adresa memoriei.

Exemplul 4:

#include using namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}

Ieșire:

Iată o captură de ecran a codului:

Explicatie cod:

  1. Declarați o variabilă pointer p și o variabilă x cu o valoare de 30.
  2. Atribuiți adresa variabilei x la p.
  3. Imprimați valoarea variabilei indicatorului p alături de un text de pe consolă.
  4. Programul trebuie să returneze valoarea la finalizarea cu succes.
  5. Sfârșitul corpului funcției main ().

Aplicarea indicatoarelor

Funcțiile în C ++ pot returna o singură valoare. În plus, toate variabilele declarate într-o funcție sunt alocate pe stiva de apeluri de funcții. De îndată ce funcția revine, toate variabilele stivei sunt distruse.

Argumentele pentru funcționare sunt transmise prin valoare și orice modificare efectuată asupra variabilelor nu modifică valoarea variabilelor reale care sunt transmise. Următorul exemplu vă ajută să ilustrați acest concept: -

Exemplul 5:

#include using namespace std;void test(int*, int*);int main() {int a = 5, b = 5;cout << "Before changing: << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;test(&a, &b);cout << "\nAfter changing" << endl;cout << "a = " << a << endl;cout << "b = " << b << endl;return 0;}void test(int* n1, int* n2) {*n1 = 10;*n2 = 11;}

Ieșire:

Iată o captură de ecran a codului:

Explicatie cod:

  1. Creați un prototip al unei funcții numite test care va lua doi parametri întregi.
  2. Apelați funcția main (). Vom adăuga logica programului în corpul său.
  3. Declarați două variabile întregi a și b, fiecare cu o valoare de 5.
  4. Imprimați un text pe consolă. Endl (linia finală) va muta cursorul pentru a începe tipărirea în următoarea linie.
  5. Imprimați valoarea variabilei a pe consolă alături de alt text. Endl (linia finală) va muta cursorul pentru a începe tipărirea în următoarea linie.
  6. Imprimați valoarea variabilei b pe consolă alături de alt text. Endl (linia finală) va muta cursorul pentru a începe tipărirea în următoarea linie.
  7. Creați o funcție numită test () care ia în parametri adresele variabilei a și b.
  8. Imprimați un text pe consolă. \ N va crea o nouă linie goală înainte ca textul să fie tipărit. Endl (linia finală) va muta cursorul pentru a începe tipărirea în următoarea linie după ce textul este tipărit.
  9. Imprimați valoarea variabilei a pe consolă alături de alt text. Endl (linia finală) va muta cursorul pentru a începe tipărirea în următoarea linie.
  10. Imprimați valoarea variabilei b pe consolă alături de alt text. Endl (linia finală) va muta cursorul pentru a începe tipărirea în următoarea linie.
  11. Programul trebuie să returneze valoarea la finalizarea cu succes.
  12. Sfârșitul corpului funcției main ().
  13. Definirea testului funcțional (). Funcția ar trebui să ia două variabile de pointer întregi * n1 și * n2.
  14. Atribuind variabila pointer * n1 o valoare de 10.
  15. Atribuind variabila indicator * n2 o valoare de 11.
  16. Sfârșitul corpului testului funcțional ().

Chiar dacă noile valori sunt atribuite variabilelor a și b din testul funcțional, odată ce apelul funcțional se finalizează, același lucru nu se reflectă în funcția externă principală.

Folosirea indicatorilor ca argumente funcționale ajută la trecerea adresei reale a variabilei în funcție, iar toate modificările efectuate asupra variabilei vor fi reflectate în funcția exterioară.

În cazul de mai sus, funcția „test” are adresa variabilelor „a” și „b”. Aceste două variabile sunt direct accesibile din funcția „test” și, prin urmare, orice modificare adusă acestor variabile se reflectă în funcția apelantului „principal”.

Avantajele utilizării pointerelor

Iată care sunt avantajele / avantajele utilizării pointerelor

  • Pointerele sunt variabile care stochează adresa altor variabile în C ++.
  • Mai multe variabile pot fi modificate și returnate prin funcție folosind pointeri.
  • Memoria poate fi alocată și delocată dinamic folosind pointeri.
  • Indicatorii ajută la simplificarea complexității programului.
  • Viteza de execuție a unui program se îmbunătățește utilizând pointeri.

Rezumat:

  • Un indicator se referă la o adresă de reținere a variabilei a altei variabile.
  • Fiecare indicator are un tip de date valid.
  • Un indicator este o reprezentare simbolică a unei adrese de memorie.
  • Indicatorii permit programelor să simuleze apelul prin referință și să creeze și să manipuleze structuri dinamice de date.
  • Tablourile și indicatoarele utilizează un concept asociat.
  • Numele matricei indică baza matricei.
  • Dacă doriți să atribuiți adresa unui tablou unui pointer, nu utilizați un ampersand (&).
  • Dacă nu există o adresă specifică pentru a atribui o variabilă de pointer, atribuiți-i un NULL.