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:
Kako ovo funkcionira:
Evo snimke zaslona koda:
Code Objaลกnjenje:
- Uvezite iostream datoteku zaglavlja. To ฤe nam omoguฤiti koriลกtenje funkcija definiranih u datoteci zaglavlja bez dobivanja pogreลกaka.
- Ukljuฤite prostor imena std da biste koristili njegove klase bez pozivanja.
- Pozovite funkciju main(). Programsku logiku treba dodati unutar tijela ove funkcije. { oznaฤava poฤetak tijela funkcije.
- Deklarirajte cjelobrojnu varijablu x i dodijelite joj vrijednost 27.
- Deklarirajte pokazivaฤku varijablu *ip.
- Pohranite adresu varijable x u varijablu pokazivaฤa.
- Ispiลกite tekst na konzoli.
- Ispiลกite vrijednost varijable x na ekranu.
- Ispiลกite tekst na konzoli.
- Ispiลกi adresu varijable x. Vrijednost adrese pohranjena je u varijabli ip.
- Ispiลกite tekst na konzoli.
- Ispis vrijednosti pohranjene na adresi pokazivaฤa.
- Program bi trebao vratiti vrijednost nakon uspjeลกnog izvoฤenja.
- 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:
Evo snimke zaslona koda:
Code Objaลกnjenje:
- Deklarirajte cjelobrojnu pokazivaฤku varijablu ip.
- Deklarirajte niz pod nazivom arr i pohranite 6 cijelih brojeva u njega.
- Dodijeli arr ip-u. IP i arr postat ฤe ekvivalentni.
- Napravite for petlju. Varijabla petlje x stvorena je za iteraciju preko elemenata niza od indeksa 0 do 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.
- Za pomicanje pokazivaฤa na sljedeฤi int poloลพaj nakon svake iteracije.
- Kraj for petlje.
- Program mora neลกto vratiti nakon uspjeลกnog izvoฤenja.
- 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:
Evo snimke zaslona koda:
Code Objaลกnjenje:
- Deklarirajte pokazivaฤku varijablu ip i dodijelite joj vrijednost NULL.
- Ispiลกi vrijednost varijable pokazivaฤa ip pored nekog teksta na konzoli.
- Program mora vratiti vrijednost nakon uspjeลกnog zavrลกetka.
- 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:
Evo snimke zaslona koda:
Code Objaลกnjenje:
- Deklarirajte pokazivaฤku varijablu p i varijablu x s โโvrijednoลกฤu 30.
- Dodijelite adresu varijable x p.
- Ispiลกi vrijednost varijable pokazivaฤa p pored nekog teksta na konzoli.
- Program mora vratiti vrijednost nakon uspjeลกnog zavrลกetka.
- 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:
Evo snimke zaslona koda:
Code Objaลกnjenje:
- Napravite prototip funkcije pod nazivom test koja ฤe uzeti dva cjelobrojna parametra.
- Pozovite funkciju main(). Dodat ฤemo logiku programa unutar njegovog tijela.
- Deklarirajte dvije cjelobrojne varijable a i b, svaka s vrijednoลกฤu 5.
- Ispiลกite tekst na konzoli. Endl (krajnji redak) ฤe pomaknuti kursor za poฤetak ispisa u sljedeฤem retku.
- Ispiลกite vrijednost varijable a na konzoli uz ostali tekst. Endl (krajnji redak) ฤe pomaknuti kursor za poฤetak ispisa u sljedeฤem retku.
- Ispiลกite vrijednost varijable b na konzoli uz ostali tekst. Endl (krajnji redak) ฤe pomaknuti kursor za poฤetak ispisa u sljedeฤem retku.
- Napravite funkciju pod nazivom test() koja uzima adrese varijabli a i b kao parametre.
- 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.
- Ispiลกite vrijednost varijable a na konzoli uz ostali tekst. Endl (krajnji redak) ฤe pomaknuti kursor za poฤetak ispisa u sljedeฤem retku.
- Ispiลกite vrijednost varijable b na konzoli uz ostali tekst. Endl (krajnji redak) ฤe pomaknuti kursor za poฤetak ispisa u sljedeฤem retku.
- Program mora vratiti vrijednost nakon uspjeลกnog zavrลกetka.
- Kraj tijela funkcije main().
- Definiranje funkcije test(). Funkcija treba uzeti dvije varijable cjelobrojnog pokazivaฤa *n1 i *n2.
- Dodjeljivanje varijabli pokazivaฤa *n1 vrijednosti 10.
- Dodjeljivanje varijabli pokazivaฤa *n2 vrijednosti 11.
- 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.







