POKAZIVAČI U JEZIKU C/C++
Svaki podatak koji se koristi u nekom programu mora biti definisan, tj. za njega se mora rezervisati memorija. Dodela vrednosti nekom podatku znači da se ta vrednost u binarnom obliku smesti na određenu memorijsku lokaciju. Pri tome je za podatak zauzeto onoliko bitova memorije koliko se zauzima za određeni tip podatka. Npr. za podatak tipa int u jeziku C/C++ to bi bilo 16 ili 32 bita.
Svaka memorijska lokacija ima neku svoju adresu. To je broj pridružen nekoj lokaciji. Najmanja memorijska lokacija koja može samostalno da se adresira je obično jedan bajt.
Pokazivač je prost podatak u koji može da se smesti adresa neke lokacije u memoriji.
Podaci na koje pokazuju pokazivači mogu biti različitih tipova.
Svaka memorijska lokacija ima neku svoju adresu. To je broj pridružen nekoj lokaciji. Najmanja memorijska lokacija koja može samostalno da se adresira je obično jedan bajt.
Pokazivač je prost podatak u koji može da se smesti adresa neke lokacije u memoriji.
Podaci na koje pokazuju pokazivači mogu biti različitih tipova.
Kada neki podatak zauzima više bajtova, pod adresom podatka podrazumeva se bajt sa najmanjim rednim brojem.
Adresa nekog podatka u memoriji može da se dobije pomoću prefiksnog unarnog operatora &. Pogledaj više o operatorima na stranici operatori u jeziku C/C++.
Adresa nekog podatka u memoriji može da se dobije pomoću prefiksnog unarnog operatora &. Pogledaj više o operatorima na stranici operatori u jeziku C/C++.
Definisanje pokazivača
* identifikator_pokazivača
Posmatrajmo sledeći kod:
Posmatrajmo sledeći kod:
Uveden je celobrojni podatak a i inicijalizovan na vrednost 1. Takođe je uveden i pokazivac pint na celobrojni podatak i on je inicijalizovan sa memorijskom adresom podatka a. Primetimo da se prilikom štampanja vrednosti pokazivača dobija veliki broj u heksadecimalnom zapisu. Adrese u memoriji su obično ovakve vrednosti.
Opis tipa podatka na početku deklarativne naredbe označava tip pokazivanog podatka. U prethodnom je to int tj. pokazivač pokazuje na ceo broj. Ukoliko bi podatak bio tipa double onda bi se pokazivač na podatak tipa double definisao i inicijalizovao na sledeći način:
double x =2;
double *pdb;
pdb= &x;
Dodela vrednosti podatku preko pokazivača na drugi podatak
Ako bi smo želeli da u prethodnom primeru uvedemo još jedan podatak tipa double npr. y i da inicijalizujemo ovu vrednost koristeći pokazivač na x, dodali bi sledeći kod:
Ako bi smo želeli da u prethodnom primeru uvedemo još jedan podatak tipa double npr. y i da inicijalizujemo ovu vrednost koristeći pokazivač na x, dodali bi sledeći kod:
double x=2;
double *pdb;
pdb= &x;
double y;
y= *pdb; //y je sada 2
Adresna aritmetika
U jeziku C/C++ dozvoljene su sledeće operacije nad pokazivačima:
- dodela vrednosti jednog pokazivača drugom
- dodavanje celobrojnog podatka na vrednost pokazivača i oduzimanje celobrojnog podatka od vrednosti pokazivača
- oduzimanje i upoređivanje dva pokazivača
- upoređivanje pokazivača nulom
Pokazivači i nizovi
Pretpostavimo da je definisan sledeći niz celih brojeva:
int A[7]={5,-2,3,8,11,0,25};
Da bi ispisali elemente niza korišćenjem pokazivača uvešćemo pokazivač pA i inicijalizovati ga memorijskom adresom prvog elementa niza:
int * pA = A ;
Da bi odštampali vrednost elementa niza na koji pokazivač pokazuje treba upotrebiti *pA:
printf("%d\n",*pA);
Da bi pokazivač menjao element na koji pokazuje tokom izvršavanja petlje, potrebno ga je inkrementirati, tj. povećati njegovu vrednost za 1:
pA++;
printf("%d\n",*(pA));
printf("%d\n",*(pA));
ili:
printf("%d\n",*(pA+i));
U prvom ciklusu, za i = 0 vrednost pokazivača, tj. adresa prvog elementa niza ima vrednost npr. 0xfdf0(heksa decimalni broj) vidi sliku 3. U svakom ciklusu vrednost pokazivača se pomeri za 1(pA++), što znači da će nova adresa biti veća za veličinu podatka u bajtovima na koji pokazuje pokazivač. Ta veličina u ovom slučaju iznosi 4 (int podatak ima veličinu od 4 bajta). Ova vrednost bi se dobila i sa sizeof(int).
U 4. ciklusu npr. i = 3, pa će vrednost memorijske adrese biti veća za 3*4=12 bajta, što je takođe prikazano na slici.
U 4. ciklusu npr. i = 3, pa će vrednost memorijske adrese biti veća za 3*4=12 bajta, što je takođe prikazano na slici.
gde se promenljiva "i" menja tokom ciklusa.
Kompletan kod se može videti u nastavku:
Kompletan kod se može videti u nastavku:
#include < stdio.h >
int main()
{
int main()
{
int A[7]={5,-2,3,8,11,0,25};
int * pA = A ;
for(int i = 0;i < 7;i++)
{
return 0;
}
int * pA = A ;
for(int i = 0;i < 7;i++)
{
printf("%d\n",(pA+i));
printf("%d\n",*(pA+i));
}printf("%d\n",*(pA+i));
return 0;
Ako pokrenemo debuger i zaustavimo program unutar petlje, možemo da analiziramo kako se vrednost adrese, na koju pokazuje pokazivač menja tokom ciklusa, kada se vrednost pokazivača promeni za 1. Za i = 3 pokazivač se pomera, tako da pokazuje na 4. element u nizu, a to znači, da se adresa uvećala za 3 * 4 bajta, tj. sa vrednosti 0x61fdf0(0 je završna) promeni se na 0x61fdfc(c je završno i to predstavlja broj 12 u heksadecimalnom sistemu).
Pokazivači i stringovi
Neka je zadat string, odnosno niz char podataka na sledeći način:
char tekst[17]= "Danas je lep dan";
Elementi ovog niza su znakovi, s tim što je poslednji znak '\0'. Više o stringovima u jeziku C pročitajte u članku: C Stringovi.
Da bi ispisali te znakove na ekranu, koristićemo petlju, a character-ima pristupiti pomoću pokazivača. Definišimo pokazivač na podatak tipa char i inicijalizujmo ga memorijskom adresom prvog elementa niza tekst:
Da bi ispisali te znakove na ekranu, koristićemo petlju, a character-ima pristupiti pomoću pokazivača. Definišimo pokazivač na podatak tipa char i inicijalizujmo ga memorijskom adresom prvog elementa niza tekst:
char* ptr = tekst;
Upotrebićemo while petlju, a znakovima pristupiti koristeći pokazivač na podatak tipa char. Kompletan kod je prikazan ispod.
#include < stdio.h >
int main()
{
int main()
{
char tekst[17]= "Danas je lep dan";
char* pTekst = tekst;
while (*ptr != '\0')
{
return 0;
}
char* pTekst = tekst;
while (*ptr != '\0')
{
printf("%c\n", *pTekst );//Ispisuje znak na koji pokazuje pokazivač pTekst
pTekst ++;//Pomeranje pokazivača na sledeći znak(character)
}pTekst ++;//Pomeranje pokazivača na sledeći znak(character)
return 0;
Uslov koji se ispituje u while petlji je da vrednost koda tekućeg character-a bude različita od vrednosti koda poslednjeg character-a, dakle, da bude različit od '\0'.
Pomeranje pokazivača, da pokazuje na sledeći znak, se ostvaruje povećanjem vrednosti pokazivača za 1. U ovom slučaju dužina char podatka je 1 bajt, pa će se adresa na koju pokazuje pokazivač promeniti u svakom ciklusu za 1 bajt a ne za 4 bajta, što je bio slučaj kod podataka tipa int.
Posle izvršenja programa, prikazaće se:
Pomeranje pokazivača, da pokazuje na sledeći znak, se ostvaruje povećanjem vrednosti pokazivača za 1. U ovom slučaju dužina char podatka je 1 bajt, pa će se adresa na koju pokazuje pokazivač promeniti u svakom ciklusu za 1 bajt a ne za 4 bajta, što je bio slučaj kod podataka tipa int.
Posle izvršenja programa, prikazaće se:
Prethodno
|< Dvodimenzionalni nizovi - matrice |
Sledeće
Funkcije u C/C++ >| |