C++ Tips med exempel

Vad รคr Pointers?

In C++, hรคnvisar en pekare till en variabel som innehรฅller adressen till en annan variabel. Precis som vanliga variabler har pekare en datatyp. Till exempel kan en pekare av typen heltal innehรฅlla adressen till en variabel av typen heltal. En pekare av teckentyp kan hรฅlla adressen till en variabel av teckentyp.

Du bรถr se en pekare som en symbolisk representation av en minnesadress. Med pekare kan program simulera call-by-referens. De kan ocksรฅ skapa och manipulera dynamiska datastrukturer. I C++, en pekarvariabel hรคnvisar till en variabel som pekar pรฅ en specifik adress i ett minne som pekas av en annan variabel.

Adresser i C++

Att fรถrstรฅ C++ tips, mรฅste du fรถrstรฅ hur datorer lagrar data.

Nรคr du skapar en variabel i din C++ programmet รคr det tilldelat lite utrymme i datorns minne. Vรคrdet pรฅ denna variabel lagras pรฅ den tilldelade platsen.

Fรถr att veta platsen i datorns minne dรคr data lagras, C++ ger & (referens)operatรถr. Operatรถren returnerar adressen som en variabel upptar.

Till exempel, om x รคr en variabel, returnerar &x adressen till variabeln.

Pointer Declaration Syntax

Fรถrklaringen av C++ tar fรถljande syntax:

datatype *variable_name; 
  • Datatypen รคr bastypen fรถr pekaren som mรฅste vara giltig C++ data typ.
  • Variabeln_namn รคr bรถr vara namnet pรฅ pekarvariabeln.
  • Asterisk som anvรคnds ovan fรถr pekardeklaration liknar den asterisk som anvรคnds fรถr att utfรถra multiplikationsoperationer. Det รคr asterisken som markerar variabeln som en pekare.

Hรคr รคr ett exempel pรฅ giltiga pekardeklarationer 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

Referensoperator (&) och referensoperator (*)

Referensoperatorn (&) returnerar variabelns adress.

Dereference-operatorn (*) hjรคlper oss att fรฅ vรคrdet som har lagrats i en minnesadress.

Till exempel:

Om vi โ€‹โ€‹har en variabel med namnet num, lagrad i adressen 0x234 och lagrar vรคrdet 28.

Referensoperatorn (&) returnerar 0x234.

Referensoperatรถren (*) kommer att returnera 5.

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

Produktion:

Referensoperator (&) och referensoperator (*)

Sรฅ hรคr fungerar:

Referensoperator (&) och referensoperator (*)

Hรคr รคr en skรคrmdump av koden:

Referensoperator (&) och referensoperator (*)

Code Fรถrklaring:

  1. Importera iostream-huvudfilen. Detta gรถr att vi kan anvรคnda funktionerna som definieras i rubrikfilen utan att fรฅ fel.
  2. Inkludera std-namnomrรฅdet fรถr att anvรคnda dess klasser utan att anropa det.
  3. Anropa main()-funktionen. Programlogiken bรถr lรคggas till i kroppen av denna funktion. { markerar bรถrjan av funktionens kropp.
  4. Deklarera en heltalsvariabel x och tilldela den vรคrdet 27.
  5. Deklarera en pekarvariabel *ip.
  6. Lagra adressen fรถr variabel x i pekarvariabeln.
  7. Skriv ut lite text pรฅ konsolen.
  8. Skriv ut vรคrdet fรถr variabel x pรฅ skรคrmen.
  9. Skriv ut lite text pรฅ konsolen.
  10. Skriv ut adressen till variabel x. Adressens vรคrde lagrades i variabeln ip.
  11. Skriv ut lite text pรฅ konsolen.
  12. Utskriftsvรคrdet fรถr lagrat pรฅ adressen till pekaren.
  13. Programmet bรถr returnera vรคrde vid framgรฅngsrikt genomfรถrande.
  14. Slutet pรฅ huvuddelen av funktionen main().

Pekare och matriser

Matriser och pekare fungerar utifrรฅn ett relaterat koncept. Det finns olika saker att notera nรคr man arbetar med arrayer som har pekare. Sjรคlva arraynamnet anger arrayens basadress. Det betyder att fรถr att tilldela en arrays adress till en pekare bรถr du inte anvรคnda ett et-tecken (&).

Till exempel:

p = arr;

Ovanstรฅende รคr korrekt eftersom arr representerar arrayernas adress. Hรคr รคr ett annat exempel:

p = &arr;

Ovanstรฅende รคr felaktigt.

Vi kan implicit omvandla en array till en pekare. Till exempel:

int arr [20];
int * ip;

Nedan รคr en giltig operation:

ip = arr;

Efter ovanstรฅende deklaration kommer ip och arr att vara likvรคrdiga, och de kommer att dela egenskaper. En annan adress kan dock tilldelas ip, men vi kan inte tilldela nรฅgot att arr.

Exempel 2:

Det hรคr exemplet visar hur man korsar en array med hjรคlp av pekare:

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

Produktion:

Pekare och matriser

Hรคr รคr en skรคrmdump av koden:

Pekare och matriser

Code Fรถrklaring:

  1. Deklarera en heltalspekarvariabel ip.
  2. Deklarera en array som heter arr och lagra 6 heltal i den.
  3. Tilldela arr till ip. IP och arr blir likvรคrdiga.
  4. Skapa en fรถr en slinga. Slingvariabeln x skapades fรถr att iterera รถver arrayelementen frรฅn index 0 till 5.
  5. Skriv ut vรคrdena lagrade pรฅ adressen till pekarens IP. Ett vรคrde kommer att returneras per iteration, och totalt 6 repetitioner kommer att gรถras. ร„nden รคr en C++ nyckelord som betyder slutraden. Denna รฅtgรคrd lรฅter dig flytta markรถren till nรคsta rad efter att varje vรคrde har skrivits ut. Varje vรคrde kommer att skrivas ut pรฅ en individuell rad.
  6. Fรถr att flytta pekaren till nรคsta int-position efter varje iteration.
  7. Slutet av fรถr en slinga.
  8. Programmet mรฅste returnera nรฅgot vid framgรฅngsrikt genomfรถrande.
  9. Slutet pรฅ huvuddelen () funktion.

NULL-pekare

Om det inte finns nรฅgon exakt adress som ska tilldelas, kan pekarvariabeln tilldelas en NULL. Det bรถr gรถras under deklarationen. En sรฅdan pekare รคr kรคnd som en nollpekare. Dess vรคrde รคr noll och definieras i mรฅnga standardbibliotek som iostream.

Exempel 3:

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

Produktion:

NULL-pekare

Hรคr รคr en skรคrmdump av koden:

NULL-pekare

Code Fรถrklaring:

  1. Deklarera en pekarvariabel ip och tilldela den vรคrdet NULL.
  2. Skriv ut vรคrde fรถr pekarvariabel ip tillsammans med lite text pรฅ konsolen.
  3. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  4. Slutet pรฅ huvuddelen av funktionen main().

Pekare av variabler

Med C++, kan du manipulera data direkt frรฅn datorns minne.

Minnesutrymmet kan tilldelas eller omtilldelas som man vill. Detta mรถjliggรถrs av Pointer-variabler.

Pekarvariabler pekar pรฅ en specifik adress i datorns minne som pekas pรฅ av en annan variabel.

Det kan deklareras enligt fรถljande:

int *p;

Eller

int* p;

I exemplet du har vi deklarerat pekarvariabeln p.

Den kommer att hรฅlla en minnesadress.

Asterisken รคr dereference-operatorn som betyder en pekare till.

Pekaren p pekar pรฅ ett heltalsvรคrde i minnesadressen.

Exempel 4:

#include <iostream>

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

Produktion:

Pekare av variabler

Hรคr รคr en skรคrmdump av koden:

Pekare av variabler

Code Fรถrklaring:

  1. Deklarera en pekarvariabel p och en variabel x med vรคrdet 30.
  2. Tilldela adressen fรถr variabel x till p.
  3. Skriv ut vรคrdet pรฅ pekarvariabeln p bredvid lite text pรฅ konsolen.
  4. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  5. Slutet pรฅ huvuddelen av funktionen main().

Tillรคmpning av pekare

Fungerar i C++ kan endast returnera ett vรคrde. Vidare allokeras alla variabler som deklareras i en funktion pรฅ funktionsanropsstacken. Sรฅ fort funktionen kommer tillbaka fรถrstรถrs alla stackvariabler.

Argument fรถr att fungera skickas av vรคrde, och alla รคndringar som gรถrs pรฅ variablerna รคndrar inte vรคrdet pรฅ de faktiska variablerna som skickas. Fรถljande exempel hjรคlper till att illustrera detta koncept: -

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

Produktion:

Tillรคmpning av pekare

Hรคr รคr en skรคrmdump av koden:

Tillรคmpning av pekare

Code Fรถrklaring:

  1. Skapa en prototyp av en funktion som heter test som tar tvรฅ heltalsparametrar.
  2. Anropa main()-funktionen. Vi kommer att lรคgga till programlogiken i dess kropp.
  3. Deklarera tvรฅ heltalsvariabler a och b, var och en med vรคrdet 5.
  4. Skriv ut lite text pรฅ konsolen. Endl (slutraden) flyttar markรถren fรถr att bรถrja skriva ut pรฅ nรคsta rad.
  5. Skriv ut vรคrdet fรถr variabel a pรฅ konsolen tillsammans med annan text. Endl (slutraden) flyttar markรถren fรถr att bรถrja skriva ut pรฅ nรคsta rad.
  6. Skriv ut vรคrdet fรถr variabel b pรฅ konsolen tillsammans med annan text. Endl (slutraden) flyttar markรถren fรถr att bรถrja skriva ut pรฅ nรคsta rad.
  7. Skapa en funktion som heter test() som tar in adresserna till variabel a och b som parametrar.
  8. Skriv ut lite text pรฅ konsolen. \n kommer att skapa en ny tom rad innan texten skrivs ut. Endl (slutraden) flyttar markรถren fรถr att bรถrja skriva ut pรฅ nรคsta rad efter att texten har skrivits ut.
  9. Skriv ut vรคrdet fรถr variabel a pรฅ konsolen tillsammans med annan text. Endl (slutraden) flyttar markรถren fรถr att bรถrja skriva ut pรฅ nรคsta rad.
  10. Skriv ut vรคrdet fรถr variabel b pรฅ konsolen tillsammans med annan text. Endl (slutraden) flyttar markรถren fรถr att bรถrja skriva ut pรฅ nรคsta rad.
  11. Programmet mรฅste returnera vรคrde efter framgรฅngsrikt slutfรถrande.
  12. Slutet pรฅ huvuddelen av funktionen main().
  13. Definierar funktionen test(). Funktionen ska ta tvรฅ heltalspekarvariabler *n1 och *n2.
  14. Tilldela pekarvariabeln *n1 ett vรคrde pรฅ 10.
  15. Tilldela pekarvariabeln *n2 ett vรคrde pรฅ 11.
  16. Slutet pรฅ kroppen av funktionstestet().

ร„ven om nya vรคrden tilldelas till variabel a och b i funktionstestet, nรคr funktionsanropet รคr klart, รฅterspeglas inte detsamma i den yttre funktionen huvud.

Att anvรคnda pekare som funktionsargument hjรคlper till att skicka variabelns faktiska adress i funktionen, och alla รคndringar som gรถrs pรฅ variabeln kommer att รฅterspeglas i den yttre funktionen.

I ovanstรฅende fall har funktionen 'test' adressen till variablerna 'a' och 'b'. Dessa tvรฅ variabler รคr direkt รฅtkomliga frรฅn funktionen 'test', och dรคrfรถr รฅterspeglas alla รคndringar som gรถrs av dessa variabler i anropsfunktionen 'main'.

Fรถrdelar med att anvรคnda Pointers

Hรคr รคr fรถrdelar/fรถrdelar med att anvรคnda Pointers

  • Pekare รคr variabler som lagrar adressen till andra variabler i C++.
  • Mer รคn en variabel kan modifieras och returneras av funktion med hjรคlp av pekare.
  • Minne kan tilldelas och avallokeras dynamiskt med hjรคlp av pekare.
  • Pekare hjรคlper till att fรถrenkla programmets komplexitet.
  • Exekveringshastigheten fรถr ett program fรถrbรคttras genom att anvรคnda pekare.

Sammanfattning

  • En pekare hรคnvisar till en variabelhรฅllaradress fรถr en annan variabel.
  • Varje pekare har en giltig datatyp.
  • En pekare รคr en symbolisk representation av en minnesadress.
  • Pekare tillรฅter program att simulera call-by-referens och skapa och manipulera dynamiska datastrukturer.
  • arrayer och pekare anvรคnder ett relaterat koncept.
  • Arraynamnet anger arrayens bas.
  • Om du vill tilldela adressen fรถr en array till en pekare, anvรคnd inte et-tecken (&).
  • Om det inte finns nรฅgon specifik adress fรถr att tilldela en pekvariabel, tilldela den en NULL.

Sammanfatta detta inlรคgg med: