C++ Pointer med eksempler

โšก Smart opsummering

En peger i C++ er en variabel, der lagrer hukommelsesadressen for en anden variabel. Her lรฆrer du, hvordan pointere fungerer, hvordan man deklarerer og bruger dem, reference- og dereferenceoperatorerne, nullpointere og deres fordele.

  • ๐Ÿ“ Hvad er det: En pointer lagrer hukommelsesadressen for en anden variabel.
  • ๐Ÿ”ง Erklรฆring: Deklarer en pointer med en asterisk, f.eks. int *ptr;.
  • ๐Ÿ”— Operators: Brug & til at fรฅ en adresse og * for at fรฅ adgang til vรฆrdien for den.
  • ๐Ÿšซ NULL: En null-pointer peger pรฅ ingenting og bruges til sikker initialisering.
  • ๐Ÿค– AI-hjรฆlp: AI-vรฆrktรธjer som GitHub Copilot skriver og fejlfinder pointerkode รธjeblikkeligt.

C++ Pointers

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.

Ofte Stillede Spรธrgsmรฅl

En pointer er en variabel, der lagrer hukommelsesadressen for en anden variabel. I stedet for at indeholde en vรฆrdi direkte, lagrer den den placering i hukommelsen, hvor vรฆrdien opbevares.

Deklarer en pointer ved at placere en asterisk mellem datatypen og navnet, f.eks. int *ptr;. Dette opretter en pointer, der kan gemme adressen pรฅ et int.

Referenceoperatoren & returnerer hukommelsesadressen for en variabel, og dereferenceoperatoren * tilgรฅr den vรฆrdi, der er gemt pรฅ den adresse, en pointer indeholder.

En NULL-pointer er en pointer, der ikke peger pรฅ nogen gyldig hukommelsesplacering. Den tildeles NULL for at vise, at den er tom, og for at undgรฅ at bruge en uinitialiseret adresse.

Et arraynavn fungerer som en pointer til dets fรธrste element, sรฅ du kan bruge pointeraritmetik til at navigere gennem arrayelementer i stedet for at bruge indeksnumre.

AI-assistenter som GitHub Copilot genererer pointerdeklarationer, skriver pointeraritmetik og markerer brug af dinglende eller nulpointer, der kan fรฅ dit program til at gรฅ ned.

Ja. AI-drevne vรฆrktรธjer registrerer hukommelseslรฆkager, dinglende pointere og null-dereferencer og foreslรฅr smarte pointere som unique_ptr til mere sikker hukommelsesstyring.

Pointere tillader direkte hukommelsesadgang, effektiv hรฅndtering af arrays og strenge, dynamisk hukommelsesallokering og overfรธrsel af store data til funktioner uden at kopiere dem.

Opsummer dette indlรฆg med: