Što su pokazivači?
U C ++-u pokazivač se odnosi na varijablu koja sadrži adresu druge varijable. Kao i redovite varijable, pokazivači imaju tip podataka. Na primjer, pokazivač cijelog broja tipa može sadržavati adresu varijable cijelog broja tipa. Pokazivač tipa znaka može sadržavati adresu varijable tipa znaka.
Pokazivač biste trebali vidjeti kao simbolički prikaz memorijske adrese. Pomoću pokazivača programi mogu simulirati poziv po referenci. Također mogu stvarati i manipulirati dinamičkim strukturama podataka. U C ++, pokazivačka varijabla odnosi se na varijablu koja pokazuje na određenu adresu u memoriji na koju ukazuje druga varijabla.
U ovom C ++ tutorialu naučit ćete:
- Što su pokazivači?
- Adrese na C ++
- Sintaksa deklaracije pokazivača
- Referentni operator (&) i Deference operator (*)
- Pokazivači i nizovi
- NULL pokazivač
- Pokazatelji varijabli
- Primjena pokazivača
- Prednosti korištenja pokazivača
Adrese na C ++
Da biste razumjeli C ++ pokazivače, morate razumjeti kako računala pohranjuju podatke.
Kada kreirate varijablu u programu C ++, dodjeljuje joj se malo prostora u memoriji računala. Vrijednost ove varijable pohranjuje se na dodijeljenom mjestu.
Da bi znao mjesto u memoriji računala na kojem su pohranjeni podaci, C ++ nudi operator & (referenca). Operator vraća adresu koju zauzima varijabla.
Na primjer, ako je x varijabla, & x vraća adresu varijable.
Sintaksa deklaracije pokazivača
Deklaracija C ++ uzima sljedeću sintaksu:
datatype *variable_name;
- Tip podataka osnovni je tip pokazivača koji mora biti važeći tip podataka C ++.
- Varijabla_ime bi trebala biti ime varijable pokazivača.
- Zvezdica upotrijebljena gore za deklaraciju pokazivača slična je zvjezdici koja se koristi za izvođenje operacije množenja. Zvjezdica je ta koja varijablu označava kao pokazivač.
Evo primjera valjanih deklaracija pokazivača u C ++:
int *x; // a pointer to integerdouble *x; // a pointer to doublefloat *x; // a pointer to floatchar *ch // a pointer to a character
Referentni operator (&) i Deference operator (*)
Referentni operator (&) vraća adresu varijable.
Operator preusmjeravanja (*) pomaže nam dobiti vrijednost koja je pohranjena u memorijskoj adresi.
Na primjer:
Ako imamo varijablu kojoj je dodijeljeno ime num, pohranjena na adresi 0x234 i pohranjuje vrijednost 28.
Referentni operator (&) vratit će 0x234.
Operator preusmjeravanja (*) vratit će 5.
Primjer 1:
#includeusing 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:
Kako ovo funkcionira:
Evo snimke zaslona koda:
Objašnjenje koda:
- Uvezite datoteku zaglavlja iostream. To će nam omogućiti da koristimo funkcije definirane u zaglavnoj datoteci bez dobivanja pogrešaka.
- Uključite std prostor imena da biste koristili njegove klase bez pozivanja.
- Pozovite glavnu () funkciju. Logiku programa treba dodati unutar tijela ove funkcije. Znak {označava početak tijela funkcije.
- Proglasite cjelobrojnu varijablu x i dodijelite joj vrijednost 27.
- Proglasite varijablu pokazivača * ip.
- Spremite adresu varijable x u varijablu pokazivača.
- Ispišite malo teksta na konzolu.
- Ispišite vrijednost varijable x na zaslon.
- Ispišite malo teksta na konzolu.
- Ispišite adresu varijable x. Vrijednost adrese pohranjena je u varijabli ip.
- Ispišite malo teksta na konzolu.
- Ispis vrijednosti pohranjene na adresi pokazivača.
- Program bi trebao vratiti vrijednost nakon uspješnog izvršavanja.
- Kraj tijela glavne () funkcije.
Pokazivači i nizovi
Nizovi i pokazivači rade na temelju srodnog koncepta. Postoje različite stvari na koje treba obratiti pažnju pri radu s nizovima koji imaju pokazivače. Samo ime niza označava osnovnu adresu niza. To znači da za dodjeljivanje adrese niza pokazivaču ne biste trebali koristiti ampersand (&).
Na primjer:
p = arr;
Gore navedeno je točno jer arr predstavlja adresu niza. Evo još jednog primjera:
p = &arr;
Gore navedeno nije toč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 jednaki i dijelit će svojstva. Međutim, ip se može dodijeliti druga adresa, ali ne možemo ništa dodijeliti arr.
Primjer 2:
Ovaj primjer pokazuje kako prijeći niz pomoću pokazivača:
#includeusing 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:
Evo snimke zaslona koda:
Objašnjenje koda:
- Proglasite cjelobrojnu varijablu pokazivača ip.
- Deklarirajte niz imena arr i u njega spremite 6 cijelih brojeva.
- Dodijelite arr ip. IP i ARR postat će jednaki.
- Stvorite petlju for. Varijabla petlje x stvorena je za iteraciju preko elemenata niza od indeksa 0 do 5.
- Ispišite vrijednosti pohranjene na adresi IP pokazivača. Vratit će se jedna vrijednost po iteraciji i izvršit će se ukupno 6 ponavljanja. Endl je ključna riječ C ++ koja znači krajnji redak. Ova radnja omogućuje vam pomicanje kursora u sljedeći redak nakon ispisa svake vrijednosti. Svaka vrijednost ispisat će se u pojedinačnom retku.
- Za pomicanje pokazivača na sljedeći položaj int nakon svake iteracije.
- Kraj petlje for.
- Program mora vratiti nešto nakon uspješnog izvršavanja.
- Kraj tijela glavne () funkcije.
NULL pokazivač
Ako ne postoji točna adresa koju treba dodijeliti, tada se varijabli pokazivača može dodijeliti NULL. To bi trebalo učiniti tijekom izjave. Takav je pokazivač poznat kao nulti pokazivač. Njegova je vrijednost nula i definirana je u mnogim standardnim knjižnicama kao što je iostream.
Primjer 3:
#includeusing namespace std;int main() {int *ip = NULL;cout << "Value of ip is: " << ip;return 0;}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Proglasite pokazivačku varijablu ip i dodijelite joj vrijednost NULL.
- Ispis vrijednosti pokazivačke varijable ip uz neki tekst na konzoli.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela glavne () funkcije.
Pokazatelji varijabli
Pomoću C ++-a možete manipulirati podacima izravno iz memorije računala.
Prostor memorije može se dodijeliti ili ponovo dodijeliti po želji. To su omogućile pokazivačke varijable.
Varijable pokazivača upućuju 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 proglasili smo pokazivačku varijablu p.
U njemu će biti memorijska adresa.
Zvjezdica je operator preusmjeravanja koji znači pokazivač na.
Pokazivač p pokazuje na cijelu vrijednost u memorijskoj adresi.
Primjer 4:
#includeusing namespace std;int main() {int *p, x = 30;p = &x;cout << "Value of x is: " << *p;return 0;}
Izlaz:
Evo snimke zaslona koda:
Objašnjenje koda:
- Deklarirajte varijablu pokazivača p i varijablu x s vrijednošću 30.
- Dodijelite adresu varijable x p.
- Ispišite vrijednost pokazivačke varijable p uz neki tekst na konzoli.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela glavne () funkcije.
Primjena pokazivača
Funkcije u C ++-u mogu vratiti samo jednu vrijednost. Dalje, sve varijable deklarirane u funkciji raspoređuju se u steku poziva funkcije. Čim se funkcija vrati, sve se varijable stoga uništavaju.
Argumenti za funkciju prosljeđuju se po vrijednosti, a svaka izmjena izvršena na varijablama ne mijenja vrijednost stvarnih varijabli koje se prosljeđuju. Sljedeći primjer pomaže ilustrirati ovaj koncept: -
Primjer 5:
#includeusing 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:
Evo snimke zaslona koda:
Objašnjenje koda:
- Stvorite prototip funkcije nazvane test koja će uzeti dva cjelobrojna parametra.
- Pozovite glavnu () funkciju. Dodat ćemo programsku logiku unutar njezina tijela.
- Navedite dvije cjelobrojne varijable a i b, od kojih svaka ima vrijednost 5.
- Ispišite malo teksta na konzolu. Endl (krajnji redak) pomaknut će kursor za početak ispisa u sljedećem retku.
- Ispišite vrijednost varijable a na konzoli uz drugi tekst. Endl (krajnji redak) pomaknut će kursor za početak ispisa u sljedećem retku.
- Ispišite vrijednost varijable b na konzoli uz drugi tekst. Endl (krajnji redak) pomaknut će kursor za početak ispisa u sljedećem retku.
- Stvorite funkciju nazvanu test () koja kao parametre uzima adrese varijabli a i b.
- Ispišite malo teksta na konzolu. \ N će stvoriti novi prazan redak prije ispisa teksta. Endl (krajnji redak) pomaknut će kursor za početak ispisa u sljedećem retku nakon ispisa teksta.
- Ispišite vrijednost varijable a na konzoli uz drugi tekst. Endl (krajnji redak) pomaknut će kursor za početak ispisa u sljedećem retku.
- Ispišite vrijednost varijable b na konzoli uz drugi tekst. Endl (krajnji redak) pomaknut će kursor za početak ispisa u sljedećem retku.
- Program mora vratiti vrijednost nakon uspješnog završetka.
- Kraj tijela glavne () funkcije.
- Definiranje testa funkcije (). Funkcija treba uzeti dvije cjelovite varijable pokazivača * n1 i * n2.
- Dodjeljivanje pokazivačkoj varijabli * n1 vrijednosti 10.
- Dodjeljivanje pokazivačkoj varijabli * n2 vrijednosti 11.
- Kraj tijela ispitivanja funkcije ().
Iako su nove vrijednosti dodijeljene varijablama a i b unutar testa funkcije, nakon završetka poziva funkcije, isto se ne odražava na glavnoj vanjskoj funkciji.
Korištenje pokazivača kao argumenta funkcije pomaže u prosljeđivanju stvarne adrese varijable u funkciji, a sve promjene izvršene na varijabli odražit će se na vanjskoj funkciji.
U gornjem slučaju, funkcija 'test' ima adresu varijabli 'a' i 'b.' Ove dvije varijable izravno su dostupne iz funkcije 'test', pa se stoga svaka promjena izvršena u tim varijablama odražava u funkciji pozivatelja "main".
Prednosti korištenja pokazivača
Evo prednosti / prednosti korištenja pokazivača
- Pokazivači su varijable koje pohranjuju adresu ostalih varijabli u C ++.
- Funkcija pomoću pokazivača može izmijeniti i vratiti više varijabli.
- Memorija se može dinamički dodijeliti i raspodijeliti pomoću pokazivača.
- Pokazivači pomažu u pojednostavljenju složenosti programa.
- Brzina izvršavanja programa poboljšava se korištenjem pokazivača.
Sažetak:
- Pokazivač se odnosi na varijablu koja sadrži adresu druge varijable.
- Svaki pokazivač ima valjani tip podataka.
- Pokazivač je simbolički prikaz memorijske adrese.
- Pokazivači dopuštaju programima da simuliraju poziv-po-referencu i stvore i upravljaju dinamičkim strukturama podataka.
- Nizovi i pokazivači koriste srodni koncept.
- Ime niza označava bazu niza.
- Ako želite pridružiti adresu niza pokazivaču, nemojte koristiti znak & (&).
- Ako nema određene adrese za dodjeljivanje varijable pokazivača, dodijelite joj NULL.