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:
Sรฅdan fungerer dette:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Importer iostream header-filen. Dette vil give os mulighed for at bruge funktionerne defineret i header-filen uden at fรฅ fejl.
- Inkluder std-navneomrรฅdet for at bruge dets klasser uden at kalde det.
- Kald funktionen main(). Programlogikken skal tilfรธjes i denne funktions brรธdtekst. { markerer begyndelsen af โโfunktionens krop.
- Deklarer en heltalsvariabel x og tildel den en vรฆrdi pรฅ 27.
- Erklรฆre en pointervariabel *ip.
- Gem adressen pรฅ variabel x i pointervariablen.
- Udskriv noget tekst pรฅ konsollen.
- Udskriv vรฆrdien af โโvariabel x pรฅ skรฆrmen.
- Udskriv noget tekst pรฅ konsollen.
- Udskriv adressen pรฅ variabel x. Vรฆrdien af โโadressen blev gemt i variablen ip.
- Udskriv noget tekst pรฅ konsollen.
- Udskriv vรฆrdi af gemt pรฅ adressen pรฅ markรธren.
- Programmet bรธr returnere vรฆrdi ved succesfuld udfรธrelse.
- 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:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Erklรฆre en heltals pointer-variabel ip.
- Erklรฆr en matrix ved navn arr og gem 6 heltal i den.
- Tildel arr til ip. IP og arr bliver รฆkvivalente.
- Opret en for en lรธkke. Lรธkkevariablen x blev oprettet for at iterere over array-elementerne fra indeks 0 til 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.
- For at flytte markรธren til den nรฆste int-position efter hver iteration.
- Slutningen af โโfor en lรธkke.
- Programmet skal returnere noget ved vellykket udfรธrelse.
- 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:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Deklarer en pointervariabel ip og tildel den vรฆrdien NULL.
- Udskriv vรฆrdien af โโpointer variabel ip sammen med noget tekst pรฅ konsollen.
- Programmet skal returnere vรฆrdi efter vellykket afslutning.
- 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:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Deklarer en pointervariabel p og en variabel x med en vรฆrdi pรฅ 30.
- Tildel adressen pรฅ variabel x til p.
- Udskriv vรฆrdien af โโpointervariabel p sammen med noget tekst pรฅ konsollen.
- Programmet skal returnere vรฆrdi efter vellykket afslutning.
- 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:
Her er et skรฆrmbillede af koden:
Code Forklaring:
- Opret en prototype af en funktion med navnet test, der tager to heltalsparametre.
- Kald funktionen main(). Vi tilfรธjer programlogikken inde i dens krop.
- Deklarer to heltalsvariable a og b, hver med en vรฆrdi pรฅ 5.
- Udskriv noget tekst pรฅ konsollen. Endl (slutlinjen) flytter markรธren for at begynde at udskrive i nรฆste linje.
- 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.
- 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.
- Opret en funktion ved navn test(), der tager adresserne pรฅ variable a og b ind som parametre.
- 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.
- 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.
- 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.
- Programmet skal returnere vรฆrdi efter vellykket afslutning.
- Slutningen af โโhoveddelen af โโfunktionen main().
- Definition af funktionstest(). Funktionen skal tage to heltals pointervariable *n1 og *n2.
- Tildeling af pointervariablen *n1 en vรฆrdi pรฅ 10.
- Tildeling af pointervariablen *n2 en vรฆrdi pรฅ 11.
- 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.







