C++ Pokazatelji s primjerima

Što su pokazivači?

In C++, pokazivač se odnosi na varijablu koja sadrži adresu druge varijable. Kao i obične varijable, pokazivači imaju tip podataka. Na primjer, pokazivač tipa integer može sadržavati adresu varijable tipa integer. Pokazivač znakovnog tipa može sadržavati adresu varijable znakovnog tipa.

Trebali biste vidjeti pokazivač kao simbolički prikaz memorijske adrese. S pokazivačima, programi mogu simulirati poziv po referenci. Oni također mogu stvarati i manipulirati dinamičkim strukturama podataka. U C++, varijabla pokazivača odnosi se na varijablu koja pokazuje na određenu adresu u memoriji na koju ukazuje druga varijabla.

Adrese u C++

Razumjeti C++ pokazivače, morate razumjeti kako računala pohranjuju podatke.

Kada kreirate varijablu u svom C++ programu, dodijeljen mu je prostor u memoriji računala. Vrijednost ove varijable pohranjena je na dodijeljenom mjestu.

Da biste znali mjesto u memoriji računala gdje su pohranjeni podaci, C++ pruža & (referentni) operator. Operator vraća adresu koju varijabla zauzima.

Na primjer, ako je x varijabla, &x vraća adresu varijable.

Sintaksa deklaracije pokazivača

Deklaracija od C++ ima sljedeću sintaksu:

datatype *variable_name; 
  • Tip podataka je osnovni tip pokazivača koji mora biti valjan C++ vrsta podataka.
  • Variable_name treba biti naziv varijable pokazivača.
  • Zvjezdica korištena gore za deklaraciju pokazivača slična je zvjezdici koja se koristi za izvođenje operacije množenja. To je zvjezdica koja označava varijablu kao pokazivač.

Ovdje je primjer valjanih deklaracija pokazivača u 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

Referentni operator (&) i Deference operator (*)

Referentni operator (&) vraća adresu varijable.

Operator dereferenciranja (*) pomaže nam da dobijemo vrijednost koja je pohranjena u memorijskoj adresi.

Na primjer:

Ako imamo varijablu s imenom num, pohranjenu na adresi 0x234 i pohranu vrijednosti 28.

Referentni operator (&) vratit će 0x234.

Operator dereferenciranja (*) vratit će 5.

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

Izlaz:

Referentni operator (&) i Deference operator (*)

Kako ovo funkcionira:

Referentni operator (&) i Deference operator (*)

Evo snimke zaslona koda:

Referentni operator (&) i Deference operator (*)

Objašnjenje koda:

  1. Uvezite iostream datoteku zaglavlja. To će nam omogućiti korištenje funkcija definiranih u datoteci zaglavlja bez dobivanja pogrešaka.
  2. Uključite prostor imena std da biste koristili njegove klase bez pozivanja.
  3. Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije. { označava početak tijela funkcije.
  4. Deklarirajte cjelobrojnu varijablu x i dodijelite joj vrijednost 27.
  5. Deklarirajte pokazivačku varijablu *ip.
  6. Pohranite adresu varijable x u varijablu pokazivača.
  7. Ispišite tekst na konzoli.
  8. Ispišite vrijednost varijable x na ekranu.
  9. Ispišite tekst na konzoli.
  10. Ispiši adresu varijable x. Vrijednost adrese pohranjena je u varijabli ip.
  11. Ispišite tekst na konzoli.
  12. Ispis vrijednosti pohranjene na adresi pokazivača.
  13. Program bi trebao vratiti vrijednost nakon uspješnog izvođenja.
  14. Kraj tijela funkcije main().

Pokazivači i nizovi

Nizovi i pokazivači rade na temelju srodnog koncepta. Postoje različite stvari koje treba imati na umu kada radite s nizovima koji imaju pokazivače. Sam naziv niza označava osnovnu adresu niza. To znači da za dodjelu adrese niza pokazivaču ne biste trebali koristiti znak & (&).

Na primjer:

p = arr;

Gore navedeno je točno budući da arr predstavlja adresu polja. Evo još jednog primjera:

p = &arr;

Gore navedeno je netočno.

Možemo implicitno pretvoriti niz u pokazivač. Na primjer:

int arr [20];
int * ip;

Ispod je važeća operacija:

ip = arr;

Nakon gornje deklaracije, ip i arr bit će ekvivalentni i dijelit će svojstva. Međutim, druga adresa se može dodijeliti ip-u, ali ne možemo ništa dodijeliti arr.

Primjer 2:

Ovaj primjer pokazuje kako preći niz pomoću pokazivača:

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

Izlaz:

Pokazivači i nizovi

Evo snimke zaslona koda:

Pokazivači i nizovi

Objašnjenje koda:

  1. Deklarirajte cjelobrojnu pokazivačku varijablu ip.
  2. Deklarirajte niz pod nazivom arr i pohranite 6 cijelih brojeva u njega.
  3. Dodijeli arr ip-u. IP i arr postat će ekvivalentni.
  4. Napravite for petlju. Varijabla petlje x stvorena je za iteraciju preko elemenata niza od indeksa 0 do 5.
  5. Ispišite vrijednosti pohranjene na IP adresi pokazivača. Vraćat će se jedna vrijednost po iteraciji, a izvršit će se ukupno 6 ponavljanja. Kraj je a C++ ključna riječ koja označava završni redak. Ova vam radnja omogućuje pomicanje pokazivača u sljedeći redak nakon ispisa svake vrijednosti. Svaka vrijednost bit će ispisana u zasebnom retku.
  6. Za pomicanje pokazivača na sljedeći int položaj nakon svake iteracije.
  7. Kraj for petlje.
  8. Program mora nešto vratiti nakon uspješnog izvođenja.
  9. Kraj tijela funkcije main().

NULL pokazivač

Ako ne postoji točna adresa koju treba dodijeliti, tada se varijabli pokazivača može dodijeliti NULL. To treba učiniti tijekom deklaracije. Takav pokazivač je poznat kao nulti pokazivač. Njegova vrijednost je nula i definirana je u mnogim standardnim bibliotekama kao što je iostream.

Primjer 3:

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

Izlaz:

NULL pokazivač

Evo snimke zaslona koda:

NULL pokazivač

Objašnjenje koda:

  1. Deklarirajte pokazivačku varijablu ip i dodijelite joj vrijednost NULL.
  2. Ispiši vrijednost varijable pokazivača ip pored nekog teksta na konzoli.
  3. Program mora vratiti vrijednost nakon uspješnog završetka.
  4. Kraj tijela funkcije main().

Pokazivači varijabli

Kontakt C++, možete manipulirati podacima izravno iz memorije računala.

Memorijski prostor se može dodijeliti ili ponovno dodijeliti prema želji. To je omogućeno varijablama pokazivača.

Varijable pokazivača pokazuju na određenu adresu u memoriji računala na koju ukazuje druga varijabla.

Može se deklarirati na sljedeći način:

int *p;

Ili,

int* p;

U vašem primjeru, deklarirali smo varijablu pokazivača p.

Sadržat će memorijsku adresu.

Zvjezdica je operator dereferencije koji označava pokazivač na.

Pokazivač p pokazuje na cjelobrojnu vrijednost u memorijskoj adresi.

Primjer 4:

#include <iostream>

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

Izlaz:

Pokazivači varijabli

Evo snimke zaslona koda:

Pokazivači varijabli

Objašnjenje koda:

  1. Deklarirajte pokazivačku varijablu p i varijablu x s ​​vrijednošću 30.
  2. Dodijelite adresu varijable x p.
  3. Ispiši vrijednost varijable pokazivača p pored nekog teksta na konzoli.
  4. Program mora vratiti vrijednost nakon uspješnog završetka.
  5. Kraj tijela funkcije main().

Primjena pokazivača

Funkcije u C++ može vratiti samo jednu vrijednost. Nadalje, sve varijable deklarirane u funkciji alocirane su na stogu poziva funkcije. Čim se funkcija vrati, sve varijable steka se uništavaju.

Argumenti funkciji prosljeđuju se prema vrijednosti, a bilo koja izmjena učinjena na varijablama ne mijenja vrijednost stvarnih varijabli koje se prosljeđuju. Sljedeći primjer pomaže ilustrirati ovaj koncept: -

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

Izlaz:

Primjena pokazivača

Evo snimke zaslona koda:

Primjena pokazivača

Objašnjenje koda:

  1. Napravite prototip funkcije pod nazivom test koja će uzeti dva cjelobrojna parametra.
  2. Pozovite funkciju main(). Dodat ćemo logiku programa unutar njegovog tijela.
  3. Deklarirajte dvije cjelobrojne varijable a i b, svaka s vrijednošću 5.
  4. Ispišite tekst na konzoli. Endl (krajnji redak) će pomaknuti kursor za početak ispisa u sljedećem retku.
  5. Ispišite vrijednost varijable a na konzoli uz ostali tekst. Endl (krajnji redak) će pomaknuti kursor za početak ispisa u sljedećem retku.
  6. Ispišite vrijednost varijable b na konzoli uz ostali tekst. Endl (krajnji redak) će pomaknuti kursor za početak ispisa u sljedećem retku.
  7. Napravite funkciju pod nazivom test() koja uzima adrese varijabli a i b kao parametre.
  8. Ispišite tekst na konzoli. \n će stvoriti novi prazan red prije ispisa teksta. Endl (završni redak) će pomaknuti kursor za početak ispisa u sljedećem retku nakon što je tekst ispisan.
  9. Ispišite vrijednost varijable a na konzoli uz ostali tekst. Endl (krajnji redak) će pomaknuti kursor za početak ispisa u sljedećem retku.
  10. Ispišite vrijednost varijable b na konzoli uz ostali tekst. Endl (krajnji redak) će pomaknuti kursor za početak ispisa u sljedećem retku.
  11. Program mora vratiti vrijednost nakon uspješnog završetka.
  12. Kraj tijela funkcije main().
  13. Definiranje funkcije test(). Funkcija treba uzeti dvije varijable cjelobrojnog pokazivača *n1 i *n2.
  14. Dodjeljivanje varijabli pokazivača *n1 vrijednosti 10.
  15. Dodjeljivanje varijabli pokazivača *n2 vrijednosti 11.
  16. Kraj tijela funkcije test().

Iako su nove vrijednosti dodijeljene varijablama a i b unutar testa funkcije, nakon završetka poziva funkcije, to se ne odražava na vanjsku funkciju main.

Korištenje pokazivača kao argumenata funkcije pomaže u prosljeđivanju stvarne adrese varijable u funkciju, a sve promjene izvršene na varijabli odrazit će se na vanjsku funkciju.

U gornjem slučaju, funkcija 'test' ima adresu varijabli 'a' i 'b.' Ovim dvjema varijablama izravno se može pristupiti iz funkcije 'test', pa se stoga svaka promjena učinjena na ovim varijablama odražava u funkciji pozivatelja 'main'.

Prednosti korištenja pokazivača

Ovdje su prednosti/prednosti korištenja pokazivača

  • Pokazivači su varijable koje pohranjuju adresu drugih varijable u C++.
  • Više od jedne varijable može se modificirati i vratiti pomoću pokazivača.
  • Memorija se može dinamički dodijeliti i de-alocirati pomoću pokazivača.
  • Pokazivači pomažu u pojednostavljivanju složenosti programa.
  • Brzina izvršavanja programa poboljšava se korištenjem pokazivača.

Rezime

  • Pokazivač se odnosi na varijablu koja drži adresu druge varijable.
  • Svaki pokazivač ima važeći tip podataka.
  • Pokazivač je simbolički prikaz memorijske adrese.
  • Pokazivači omogućuju programima simulaciju poziva po referenci te stvaranje i manipuliranje dinamičkim strukturama podataka.
  • nizovi a pokazivači koriste srodni koncept.
  • Naziv niza označava bazu niza.
  • Ako želite dodijeliti adresu niza pokazivaču, nemojte koristiti znak & (&).
  • Ako ne postoji određena adresa za dodjelu pokazivačke varijable, dodijelite joj NULL.

Sažmite ovu objavu uz: