C++ Pointer med eksempler

Hvad er pointere?

In C++, henviser en pointer til en variabel, der har adressen på en anden variabel. Som almindelige variabler har pointere en datatype. For eksempel kan en pointer af typen heltal indeholde adressen på en variabel af typen heltal. En markør af tegntype kan indeholde adressen på en variabel af karaktertype.

Du bør se en markør som en symbolsk repræsentation af en hukommelsesadresse. Med pointere kan programmer simulere call-by-reference. De kan også skabe og manipulere dynamiske datastrukturer. I C++, henviser en pointervariabel til en variabel, der peger på en specifik adresse i en hukommelse, der peges af en anden variabel.

Adresser i C++

At forstå C++ pointere, skal du forstå, hvordan computere gemmer data.

Når du opretter en variabel i din C++ program, er det tildelt noget plads i computerens hukommelse. Værdien af ​​denne variabel gemmes på den tildelte placering.

For at kende placeringen i computerens hukommelse, hvor dataene er gemt, C++ giver & (reference)operatør. Operatøren returnerer den adresse, som en variabel optager.

For eksempel, hvis x er en variabel, returnerer &x adressen på variablen.

Pointer Declaration Syntaks

Erklæringen af C++ tager følgende syntaks:

datatype *variable_name; 
  • Datatypen er basistypen for pointeren, som skal være en gyldig C++ datatype.
  • Variablen_name er skal være navnet på pointervariablen.
  • Asterisk brugt ovenfor til pointer-erklæring svarer til stjerne, der bruges til at udføre multiplikationsoperation. Det er stjernen, der markerer variablen som en pointer.

Her er et eksempel på gyldige pointer-erklæringer i 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

Referenceoperator (&) og referenceoperator (*)

Referenceoperatoren (&) returnerer variablens adresse.

Dereference-operatoren (*) hjælper os med at få den værdi, der er blevet gemt i en hukommelsesadresse.

For eksempel:

Hvis vi har en variabel givet navnet num, gemt i adressen 0x234 og gemmer værdien 28.

Referenceoperatoren (&) vil returnere 0x234.

Dereferenceoperatøren (*) returnerer 5.

Eksempel 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;
}

Output:

Referenceoperator (&) og referenceoperator (*)

Sådan fungerer dette:

Referenceoperator (&) og referenceoperator (*)

Her er et skærmbillede af koden:

Referenceoperator (&) og referenceoperator (*)

Kodeforklaring:

  1. Importer iostream header-filen. Dette vil give os mulighed for at bruge funktionerne defineret i header-filen uden at få fejl.
  2. Inkluder std-navneområdet for at bruge dets klasser uden at kalde det.
  3. Kald funktionen main(). Programlogikken skal tilføjes i denne funktions brødtekst. { markerer begyndelsen af ​​funktionens krop.
  4. Deklarer en heltalsvariabel x og tildel den en værdi på 27.
  5. Erklære en pointervariabel *ip.
  6. Gem adressen på variabel x i pointervariablen.
  7. Udskriv noget tekst på konsollen.
  8. Udskriv værdien af ​​variabel x på skærmen.
  9. Udskriv noget tekst på konsollen.
  10. Udskriv adressen på variabel x. Værdien af ​​adressen blev gemt i variablen ip.
  11. Udskriv noget tekst på konsollen.
  12. Udskriv værdi af gemt på adressen på markøren.
  13. Programmet bør returnere værdi ved succesfuld udførelse.
  14. Slutningen af ​​hoveddelen af ​​funktionen main().

Pointere og arrays

Arrays og pointere arbejder ud fra et relateret koncept. Der er forskellige ting at bemærke, når du arbejder med arrays med pointere. Selve arraynavnet angiver arrayets basisadresse. Det betyder, at for at tildele adressen på et array til en pointer, skal du ikke bruge et og-tegn (&).

For eksempel:

p = arr;

Ovenstående er korrekt, da arr repræsenterer arrayernes adresse. Her er et andet eksempel:

p = &arr;

Ovenstående er forkert.

Vi kan implicit konvertere et array til en pointer. For eksempel:

int arr [20];
int * ip;

Nedenfor er en gyldig operation:

ip = arr;

Efter ovenstående erklæring vil ip og arr være ækvivalente, og de vil dele egenskaber. Der kan dog tildeles en anden adresse til ip, men vi kan ikke tildele noget at arr.

Eksempel 2:

Dette eksempel viser, hvordan man krydser et array ved hjælp af pointere:

#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;
}

Output:

Pointere og arrays

Her er et skærmbillede af koden:

Pointere og arrays

Kodeforklaring:

  1. Erklære en heltals pointer-variabel ip.
  2. Erklær en matrix ved navn arr og gem 6 heltal i den.
  3. Tildel arr til ip. IP og arr bliver ækvivalente.
  4. Opret en for en løkke. Løkkevariablen x blev oprettet for at iterere over array-elementerne fra indeks 0 til 5.
  5. Udskriv de værdier, der er gemt på adressen på markørens IP. Én værdi vil blive returneret pr. iteration, og i alt 6 gentagelser vil blive udført. Endl er en C++ søgeord, der betyder slutlinjen. Denne handling giver dig mulighed for at flytte markøren til næste linje, efter at hver værdi er udskrevet. Hver værdi vil blive udskrevet i en individuel linje.
  6. For at flytte markøren til den næste int-position efter hver iteration.
  7. Slutningen af ​​for en løkke.
  8. Programmet skal returnere noget ved vellykket udførelse.
  9. Slutningen af ​​hoved() funktionsteksten.

NULL Pointer

Hvis der ikke er en nøjagtig adresse, der skal tildeles, kan pointervariablen tildeles en NULL. Det skal ske under erklæringen. En sådan pointer er kendt som en nul pointer. Dens værdi er nul og er defineret i mange standardbiblioteker som iostream.

Eksempel 3:

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

Output:

NULL Pointer

Her er et skærmbillede af koden:

NULL Pointer

Kodeforklaring:

  1. Deklarer en pointervariabel ip og tildel den værdien NULL.
  2. Udskriv værdien af ​​pointer variabel ip sammen med noget tekst på konsollen.
  3. Programmet skal returnere værdi efter vellykket afslutning.
  4. Slutningen af ​​hoveddelen af ​​funktionen main().

Pointers of variables

Med C++, kan du manipulere data direkte fra computerens hukommelse.

Hukommelsespladsen kan tildeles eller gentildeles, som man ønsker. Dette er muliggjort af Pointer-variabler.

Pointervariabler peger på en specifik adresse i computerens hukommelse, der peges på af en anden variabel.

Det kan erklæres som følger:

int *p;

Eller

int* p;

I dit eksempel har vi erklæret pointervariablen p.

Det vil indeholde en hukommelsesadresse.

Stjernen er den dereferenceoperator, der betyder en pegepind til.

Markøren p peger på en heltalsværdi i hukommelsesadressen.

Eksempel 4:

#include <iostream>

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

Output:

Pointers of variables

Her er et skærmbillede af koden:

Pointers of variables

Kodeforklaring:

  1. Deklarer en pointervariabel p og en variabel x med en værdi på 30.
  2. Tildel adressen på variabel x til p.
  3. Udskriv værdien af ​​pointervariabel p sammen med noget tekst på konsollen.
  4. Programmet skal returnere værdi efter vellykket afslutning.
  5. Slutningen af ​​hoveddelen af ​​funktionen main().

Anvendelse af pointere

Fungerer i C++ kan kun returnere én værdi. Yderligere allokeres alle variabler, der er erklæret i en funktion, på funktionsopkaldsstakken. Så snart funktionen vender tilbage, bliver alle stackvariablerne ødelagt.

Argumenter for at fungere videregives af værdi, og enhver ændring, der udføres på variablerne, ændrer ikke værdien af ​​de faktiske variable, der sendes. Følgende eksempel hjælper med at illustrere dette koncept: -

Eksempel 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;
}

Output:

Anvendelse af pointere

Her er et skærmbillede af koden:

Anvendelse af pointere

Kodeforklaring:

  1. Opret en prototype af en funktion med navnet test, der tager to heltalsparametre.
  2. Kald funktionen main(). Vi tilføjer programlogikken inde i dens krop.
  3. Deklarer to heltalsvariable a og b, hver med en værdi på 5.
  4. Udskriv noget tekst på konsollen. Endl (slutlinjen) flytter markøren for at begynde at udskrive i næste linje.
  5. Udskriv værdien af ​​variabel a på konsollen sammen med anden tekst. Endl (slutlinjen) flytter markøren for at begynde at udskrive i næste linje.
  6. Udskriv værdien af ​​variabel b på konsollen sammen med anden tekst. Endl (slutlinjen) flytter markøren for at begynde at udskrive i næste linje.
  7. Opret en funktion ved navn test(), der tager adresserne på variable a og b ind som parametre.
  8. Udskriv noget tekst på konsollen. \n vil oprette en ny tom linje, før teksten udskrives. Endl (slutlinjen) vil flytte markøren for at begynde at udskrive i den næste linje, efter at teksten er udskrevet.
  9. Udskriv værdien af ​​variabel a på konsollen sammen med anden tekst. Endl (slutlinjen) flytter markøren for at begynde at udskrive i næste linje.
  10. Udskriv værdien af ​​variabel b på konsollen sammen med anden tekst. Endl (slutlinjen) flytter markøren for at begynde at udskrive i næste linje.
  11. Programmet skal returnere værdi efter vellykket afslutning.
  12. Slutningen af ​​hoveddelen af ​​funktionen main().
  13. Definition af funktionstest(). Funktionen skal tage to heltals pointervariable *n1 og *n2.
  14. Tildeling af pointervariablen *n1 en værdi på 10.
  15. Tildeling af pointervariablen *n2 en værdi på 11.
  16. Slutningen af ​​brødteksten af ​​funktionstesten().

Selvom der tildeles nye værdier til variabel a og b inde i funktionstesten, afspejles det samme ikke den ydre hovedfunktion, når først funktionskaldet er fuldført.

Brug af pointere som funktionsargumenter hjælper med at videregive variablens faktiske adresse i funktionen, og alle de ændringer, der udføres på variablen, vil blive afspejlet i den ydre funktion.

I ovenstående tilfælde har funktionen 'test' adressen på variablerne 'a' og 'b.' Disse to variable er direkte tilgængelige fra funktionen 'test', og derfor afspejles enhver ændring af disse variable i kaldefunktionen 'main'.

Fordele ved at bruge pointere

Her er fordele/fordele ved at bruge pointere

  • Pointere er variable, som gemmer andres adresse variabler i C++.
  • Mere end én variabel kan ændres og returneres af funktion ved hjælp af pointere.
  • Hukommelse kan tildeles dynamisk og deallokeres ved hjælp af pointere.
  • Pointers hjælper med at forenkle kompleksiteten af ​​programmet.
  • Udførelseshastigheden af ​​et program forbedres ved at bruge pointere.

Resumé

  • En pointer refererer til en variabel-holdeadresse for en anden variabel.
  • Hver pointer har en gyldig datatype.
  • En pointer er en symbolsk repræsentation af en hukommelsesadresse.
  • Pointere tillader programmer at simulere call-by-reference og skabe og manipulere dynamiske datastrukturer.
  • Arrays og pointere bruger et beslægtet koncept.
  • Arraynavnet angiver arrayets base.
  • Hvis du vil tildele adressen på et array til en markør, skal du ikke bruge et og-tegn (&).
  • Hvis der ikke er nogen specifik adresse til at tildele en pointervariabel, skal du tildele den en NULL.