Mozda je bolje umesto pitanja "kada koristiti pointere" da nadjes odgovor "kako koristiti pointere". Uz malo citanja tudjeg koda i resavanja konkretnih problema vrlo ces brzo naci odgovor i na tvoje pitanje.
Zvuci banalno, ali namena pokazivaca je da "adresiraju" neki memorijski prostor. Cesce se tu nalaze upisani podaci ili cak pokazivaci na drugi memorijski prostor, a postoje i pokazivaci na memorijski prostor gde se nalazi "izvrsni kod" funkcija.
Memorijski prostor o kome se vodi racuna pri pisanju C/C++ programa moze biti heap (lokalne promenljive koriste ovaj prostor - stek), staticki (prostor koji je rezervisan za staticke promenljive i koji je zauzet celo vreme dok se izvrsava tvoja aplikacija) i dinamicki alociran prostor (deo memorije koji se alocira i oslobadja za vreme izvrsavanja.
Bilo koji od ovih delova memorije moze da sadrzi pokazivace (ptrs), a prts mogu da adresiraju bilo koji od ovih delova.
Dva su glavna nacina kako da koristis ptrs.
1) da pokazuju vec na alociran prostor:
static char txt[] = "dddddddddddd"
void Fja()
{
char *t = txt;
char first = *t;
++t;
*t = 'e';
}
2) da pokazuju na prostor koji sam alociras
void Fja()
{
char c = new char[20];
*c = 'e';
*(c + 1) = 'f';
*c[2] = 'g';
delete[] c;
}
Medjutim, ako ovako napises:
void Fja()
{
char c = new char[20];
*c = 'e'; ++c;
*c = 'f'; ++c;
*c = 'g'; ...
}
izgubices adresu alociranog prostora na koju je prvo pokazivala prom. c i neces moci (ukoliko ne znas koliko si puta povecao c, pa da ga umanjis na kraju za taj broj) da oslobodis prostor.
Cak i ako ne zvuci strasno "zarobljeno 20 bajtova", zamisli da se Fja poziva 300 puta u sek. Vrlo brzo bi ti aplikacija, u potrazi za memorijom, pocela "brljati" po HD.
Prem tome, UVEK moras da oslobodis sav alociran prostor.
Da bi sebi pomogao, da bi izbegao warninge ili greske kompajliranja, pucanje programa,... uvek se trudi da koristis ptrs na ovaj nacin:
int *a = 0;
.....
Deo programa gde su inicijalizacije ili deo koda kome treba prostor za N int-ova
a = FjaKojaVracaPokazivacNaNizInt() ili a = new int[N]
......
Priprema za "terminaciju" ili deo koda kad ti vise ne trebaju tih N int-ova
if (a)
{
delete a;
a = 0;
}
.....
Jedna bitna primena ptrs je kad ti nije dovoljna samo jedna povratna vrednost f-je. Recimo, fja koja vraca "polozaj misa" na ekranu:
void GdeJeMis( int *x, int *y ) {
*x = ...;
*y = ...;
}
int x, y;
GdeJeMis( &x, &y );
Posebno je bitno koristiti pts kad imas f-ju koja zavisi od velikog broja ulaznih parametara. Tada je najbolje da deklarises strukturu/klasu koja sadrzi sve te podatke i da umesto strukture kao ulazni parametar prosledis njenu adresu:
struct {
float m[100][100];
float det;
} MATiDET;
MATiDET md;
InitMat( &md );
void InitMat( MATiDET *mm )
{
...
}
Ptr moze biti i rezultat izvrsavanje neke fje:
int *NapraviMesta( int n ) { return new int[n]; }
int *p = NapraviMesta( 10 );
KoristiP( p );
delete[] p;
Svakako ovo je jako dobar savet
Citat:
Vanja Petreski: Pocetnik bi trebao prvo da dohvati neku dobru knjigu pa da je izbistri, a onda da postavlja pitanja ;o)
a jos je bolji efekat ako ti je knjiga ispred tastature i ako si ukucane poslao u banju ili bioskop :)