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 este: Un pointer stocheazฤƒ adresa de memorie a unei alte variabile.
  • ๐Ÿ”ง Declaraลฃie: Declaraศ›i un pointer cu un asterisc, cum ar fi int *ptr;.
  • ๐Ÿ”— Operators: Foloseศ™te & pentru a obศ›ine o adresฤƒ ศ™i * pentru a accesa valoarea acesteia.
  • ๐Ÿšซ NUL: Un pointer nul indicฤƒ nimic ศ™i este utilizat pentru iniศ›ializare รฎn siguranศ›ฤƒ.
  • ๐Ÿค– Ajutor AI: Instrumentele de inteligenศ›ฤƒ artificialฤƒ precum GitHub Copilot scriu ศ™i depaneazฤƒ codul pointerului instantaneu.

C++ Pointeri

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 (*)

Code Explicaลฃie:

  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

Code Explicaลฃie:

  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

Code Explicaลฃie:

  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

Code Explicaลฃie:

  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

Code Explicaลฃie:

  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.

รŽntrebฤƒri frecvente

Un pointer este o variabilฤƒ care stocheazฤƒ adresa de memorie a unei alte variabile. รŽn loc sฤƒ stocheze direct o valoare, acesta stocheazฤƒ locaศ›ia รฎn care este pฤƒstratฤƒ valoarea รฎn memorie.

Declaraศ›i un pointer plasรขnd un asterisc รฎntre tipul de date ศ™i nume, cum ar fi int *ptr;. Aceasta creeazฤƒ un pointer care poate stoca adresa unui numฤƒr รฎntreg.

Operatorul de referinศ›ฤƒ & returneazฤƒ adresa de memorie a unei variabile, iar operatorul de dereferenศ›iere * acceseazฤƒ valoarea stocatฤƒ la adresa pe care o deศ›ine un pointer.

Un pointer NULL este un pointer care nu indicฤƒ nicio locaศ›ie de memorie validฤƒ. I se atribuie valoarea NULL pentru a indica faptul cฤƒ este gol ศ™i pentru a evita utilizarea unei adrese neiniศ›ializate.

Un nume de matrice acศ›ioneazฤƒ ca un pointer cฤƒtre primul sฤƒu element, astfel รฎncรขt puteศ›i utiliza aritmetica pointerilor pentru a vฤƒ deplasa prin elementele matricei รฎn loc sฤƒ utilizaศ›i numere de index.

Asistenศ›ii de inteligenศ›ฤƒ artificialฤƒ precum GitHub Copilot genereazฤƒ declaraศ›ii de pointeri, scriu aritmeticฤƒ pentru pointeri ศ™i semnaleazฤƒ utilizarea indicatorilor suspendaศ›i sau nuli care ar putea duce la blocarea programului.

Da. Instrumentele bazate pe inteligenศ›ฤƒ artificialฤƒ detecteazฤƒ pierderi de memorie, pointeri suspendaศ›i ศ™i dereferenศ›ieri nule ศ™i sugereazฤƒ pointeri inteligenศ›i precum unique_ptr pentru o gestionare mai sigurฤƒ a memoriei.

Pointerii permit accesul direct la memorie, gestionarea eficientฤƒ a matricelor ศ™i a ศ™irurilor de caractere, alocarea dinamicฤƒ a memoriei ศ™i transmiterea de date voluminoase cฤƒtre funcศ›ii fฤƒrฤƒ a le copia.

Rezumaศ›i aceastฤƒ postare cu: