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

Code Forklaring:

  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

Code Forklaring:

  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

Code Forklaring:

  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

Code Forklaring:

  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

Code Forklaring:

  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.

Opsummer dette indlรฆg med: