C++ Indicatori cu exemple

Ce sunt pointerii?

In C++, un pointer se referă la o variabilă care deține adresa altei variabile. La fel ca variabilele obișnuite, pointerii au un tip de date. De exemplu, un pointer de tip integer poate deține adresa unei variabile de tip integer. Un pointer de tip caracter poate deține adresa unei variabile de tip caracter.

Ar trebui să vedeți un indicator ca o reprezentare simbolică a unei adrese de memorie. Cu indicatoare, programele pot simula apelul 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 anumită adresă dintr-o memorie indicată de o altă variabilă.

Adrese în C++

A întelege C++ indicatoare, trebuie să înțelegeți cum stochează datele computerele.

Când creați o variabilă în dvs C++ programului, 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++ furnizează & operator (de referință). Operatorul returnează adresa pe care o ocupă o variabilă.

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

Sintaxa Declarației Pointerului

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

datatype *variable_name; 
  • Tipul de date este tipul de bază al indicatorului care trebuie să fie valid C++ tipul de date.
  • 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 înmulțire. Este asteriscul care marchează variabila ca indicator.

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

int    *x;    // a pointer to integer
double *x;    // a pointer to double
float  *x;    // a pointer to float
char   *ch     // a pointer to a character

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

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

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

De exemplu:

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

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

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

Exemplu 1:

#include <iostream>
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:

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

Cum funcționează acest lucru:

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

Iată o captură de ecran a codului:

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

Explicația codului:

  1. Importați fișierul antet iostream. Acest lucru 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 ar trebui 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. Tipăriți ceva text pe consolă.
  8. Tipăriți valoarea variabilei x pe ecran.
  9. Tipăriți ceva text pe consolă.
  10. Tipăriți adresa variabilei x. Valoarea adresei a fost stocată în variabila ip.
  11. Tipăriți ceva text pe consolă.
  12. Imprimați valoarea stocată la adresa indicatorului.
  13. Programul ar trebui să returneze valoare după executarea cu succes.
  14. Sfârșitul corpului funcției main().

Pointere și tablouri

Matricele și pointerii funcționează pe baza unui concept înrudit. Există diferite lucruri de reținut atunci când lucrați cu tablouri care au pointeri. Numele matricei în sine denotă adresa de bază a matricei. Aceasta î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 împărtăși proprietăți. Cu toate acestea, o altă adresă poate fi atribuită ipului, dar nu putem aloca nimic lui arr.

Exemplu 2:

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

#include <iostream>
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:

Pointere și tablouri

Iată o captură de ecran a codului:

Pointere și tablouri

Explicația codului:

  1. Declarați o variabilă tip pointer î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 o buclă for a. Variabila buclă x a fost creată pentru a itera elementele matricei de la indexul 0 la 5.
  5. Tipăriți valorile stocate la adresa IP-ului indicatorului. O valoare va fi returnată pe iterație și se vor face un total de 6 repetări. Sfârșitul este a C++ cuvânt cheie care înseamnă linia finală. Această acțiune vă permite să mutați cursorul pe linia următoare după ce fiecare valoare este imprimată. Fiecare valoare va fi tipărită pe o linie individuală.
  6. Pentru a muta indicatorul la următoarea poziție int după fiecare iterație.
  7. Sfârșitul buclei for a.
  8. Programul trebuie să returneze ceva la executarea cu succes.
  9. Sfârșitul corpului funcției main().

Pointer NULL

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

Exemplu 3:

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

ieșire:

Pointer NULL

Iată o captură de ecran a codului:

Pointer NULL

Explicația codului:

  1. Declarați o variabilă pointer ip și atribuiți-i o valoare NULL.
  2. Imprimați valoarea variabilei pointer ip alături de un text pe consolă.
  3. Programul trebuie să returneze valoare după 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 alocat sau reatribuit după cum doriți. Acest lucru este posibil de variabilele Pointer.

Variabilele pointer indică o anumită adresă din memoria computerului, indicată de o altă variabilă.

Se poate declara astfel:

int *p;

Sau,

int* p;

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

Va deține o adresă de memorie.

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

Indicatorul p indică o valoare întreagă din adresa de memorie.

Exemplu 4:

#include <iostream>

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

ieșire:

Indicatori de variabile

Iată o captură de ecran a codului:

Indicatori de variabile

Explicația codului:

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

Aplicarea Pointerilor

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

Argumentele pentru funcționare sunt transmise după valoare, iar orice modificare efectuată asupra variabilelor nu modifică valoarea variabilelor reale care sunt transmise. Următorul exemplu ajută la ilustrarea acestui concept: -

Exemplu 5:

#include <iostream>

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:

Aplicarea Pointerilor

Iată o captură de ecran a codului:

Aplicarea Pointerilor

Explicația codului:

  1. Creați un prototip al unei funcții numită 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. Tipăriți ceva text pe consolă. Endl (linia de final) va muta cursorul pentru a începe tipărirea în linia următoare.
  5. Tipăriți valoarea variabilei a pe consolă alături de alt text. Endl (linia de final) va muta cursorul pentru a începe tipărirea în linia următoare.
  6. Tipăriți valoarea variabilei b pe consolă alături de alt text. Endl (linia de final) va muta cursorul pentru a începe tipărirea în linia următoare.
  7. Creați o funcție numită test() care preia adresele variabilelor a și b ca parametri.
  8. Tipăriți ceva text pe consolă. \n va crea o nouă linie goală înainte ca textul să fie tipărit. Endl (linia de final) va muta cursorul pentru a începe tipărirea pe linia următoare după tipărirea textului.
  9. Tipăriți valoarea variabilei a pe consolă alături de alt text. Endl (linia de final) va muta cursorul pentru a începe tipărirea în linia următoare.
  10. Tipăriți valoarea variabilei b pe consolă alături de alt text. Endl (linia de final) va muta cursorul pentru a începe tipărirea în linia următoare.
  11. Programul trebuie să returneze valoare după finalizarea cu succes.
  12. Sfârșitul corpului funcției main().
  13. Definirea funcției test(). Funcția ar trebui să ia două variabile de tip pointer întregi *n1 și *n2.
  14. Atribuind variabilei pointer *n1 o valoare de 10.
  15. Atribuind variabilei pointer *n2 o valoare de 11.
  16. Sfârșitul corpului testului funcției().

Chiar dacă, valorile noi sunt atribuite variabilelor a și b în interiorul testului funcției, odată ce apelul funcției este finalizat, același lucru nu se reflectă în funcția principală exterioară.

Utilizarea pointerilor ca argumente ale funcției 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 este reflectată în funcția de apelare „principală”.

Avantajele utilizării Pointerilor

Iată avantajele/beneficiile utilizării Pointers

  • Pointerii sunt variabile care stochează adresa altora variabile în C++.
  • Mai mult de o variabilă poate fi modificată și returnată de funcție folosind pointeri.
  • Memoria poate fi alocată și dezalocată dinamic folosind pointeri.
  • Indicatorii ajută la simplificarea complexității programului.
  • Viteza de execuție a unui program se îmbunătățește folosind pointeri.

Rezumat

  • Un pointer se referă la o variabilă care deține adresa unei alte variabile.
  • Fiecare indicator are un tip de date valid.
  • Un pointer este o reprezentare simbolică a unei adrese de memorie.
  • Pointerii permit programelor să simuleze apelul prin referință și să creeze și să manipuleze structuri dinamice de date.
  • Arrays iar indicatorii folosesc un concept înrudit.
  • Numele matricei denotă 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ă pointer, atribuiți-i un NULL.