C++ Indicatori cu exemple
โก Rezumat inteligent
Un indicator รฎn C++ este o variabilฤ care stocheazฤ adresa de memorie a unei alte variabile. Aici veศi รฎnvฤศa cum funcศioneazฤ pointerii, cum sฤ รฎi declaraศi ศi sฤ รฎi utilizaศi, operatorii de referinศฤ ศi dereferenศiere, pointerii nuli ศi avantajele acestora.

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:
Cum funcศioneazฤ acest lucru:
Iatฤ o capturฤ de ecran a codului:
Code Explicaลฃie:
- 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.
- Includeศi spaศiul de nume std pentru a-ศi folosi clasele fฤrฤ a-l apela.
- Apelaศi funcศia main(). Logica programului ar trebui adฤugatฤ รฎn corpul acestei funcศii. { marcheazฤ รฎnceputul corpului funcศiei.
- Declaraศi o variabilฤ รฎntreagฤ x ศi atribuiศi-i o valoare de 27.
- Declaraศi o variabilฤ pointer *ip.
- Stocaศi adresa variabilei x รฎn variabila pointer.
- Tipฤriศi ceva text pe consolฤ.
- Tipฤriศi valoarea variabilei x pe ecran.
- Tipฤriศi ceva text pe consolฤ.
- Tipฤriศi adresa variabilei x. Valoarea adresei a fost stocatฤ รฎn variabila ip.
- Tipฤriศi ceva text pe consolฤ.
- Imprimaศi valoarea stocatฤ la adresa indicatorului.
- Programul ar trebui sฤ returneze valoare dupฤ executarea cu succes.
- 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:
Iatฤ o capturฤ de ecran a codului:
Code Explicaลฃie:
- Declaraศi o variabilฤ tip pointer รฎntreg ip.
- Declaraศi o matrice numitฤ arr ศi stocaศi 6 numere รฎntregi รฎn ea.
- Atribuiศi arr la ip. IP ศi arr vor deveni echivalente.
- Creaศi o buclฤ for a. Variabila buclฤ x a fost creatฤ pentru a itera elementele matricei de la indexul 0 la 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ฤ.
- Pentru a muta indicatorul la urmฤtoarea poziศie int dupฤ fiecare iteraศie.
- Sfรขrศitul buclei for a.
- Programul trebuie sฤ returneze ceva la executarea cu succes.
- 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:
Iatฤ o capturฤ de ecran a codului:
Code Explicaลฃie:
- Declaraศi o variabilฤ pointer ip ศi atribuiศi-i o valoare NULL.
- Imprimaศi valoarea variabilei pointer ip alฤturi de un text pe consolฤ.
- Programul trebuie sฤ returneze valoare dupฤ finalizarea cu succes.
- 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:
Iatฤ o capturฤ de ecran a codului:
Code Explicaลฃie:
- Declaraศi o variabilฤ indicator p ศi o variabilฤ x cu o valoare de 30.
- Atribuiศi adresa variabilei x cฤtre p.
- Tipฤriศi valoarea variabilei indicatorului p alฤturi de un text pe consolฤ.
- Programul trebuie sฤ returneze valoare dupฤ finalizarea cu succes.
- 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:
Iatฤ o capturฤ de ecran a codului:
Code Explicaลฃie:
- Creaศi un prototip al unei funcศii numitฤ test care va lua doi parametri รฎntregi.
- Apelaศi funcศia main(). Vom adฤuga logica programului รฎn corpul sฤu.
- Declaraศi douฤ variabile รฎntregi a ศi b, fiecare cu o valoare de 5.
- Tipฤriศi ceva text pe consolฤ. Endl (linia de final) va muta cursorul pentru a รฎncepe tipฤrirea รฎn linia urmฤtoare.
- 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.
- 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.
- Creaศi o funcศie numitฤ test() care preia adresele variabilelor a ศi b ca parametri.
- 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.
- 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.
- 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.
- Programul trebuie sฤ returneze valoare dupฤ finalizarea cu succes.
- Sfรขrศitul corpului funcศiei main().
- Definirea funcศiei test(). Funcศia ar trebui sฤ ia douฤ variabile de tip pointer รฎntregi *n1 ศi *n2.
- Atribuind variabilei pointer *n1 o valoare de 10.
- Atribuind variabilei pointer *n2 o valoare de 11.
- 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.







