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

Code Objaลกnjenje:

  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

Code Objaลกnjenje:

  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ฤ

Code Objaลกnjenje:

  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

Code Objaลกnjenje:

  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

Code Objaลกnjenje:

  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: