[ festis-swe @ 18.10.2002. 12:26 ] @
Imam veliki problem recimo da mislim da sam shvatio sta su pointeri .. ali imam problme ne znam kako da to ubacim u code .. Ne shvacam tocno jos sta su pointeri .. pointeri na funckiju na polje i pointer na pointer .. . Jel ima neko ko bi odvojio malo vremena i napiso nesto o tome jer sta Ma kolko muckao nece da shvati moj mozak ... Sad prije ispita sam jos odlucio procitat sta se spominje u svezi pointera u Demistificiranom C++ ali kolko sam vidio nema bas puno o tome.
Unaprijed zahvaljujem
[ Ivan Dimkovic @ 18.10.2002. 12:44 ] @
Pointer ti je jednostavno "pokazivac" na memorijsku lokaciju - znaci, ako je arhitektura 32-bitna, pointer je jedan 32-bitni broj koji pokazuje na mem lokaciju.

Dakle, ako imas:

int a;
int b;
int *pokazivac_na_a;

pokazivac_na_a = &a; // adresa od a


i sada:

Citat:

*POINTER menja memorijsku adresu pointera


a = 5 je isto sto i *pokazivac_na_a = 5;

a ako uradis

Citat:

Menjanje pointera menja samo adresu na koju pointer pokazuje, ne vrednost te adrese


pokazivac_na_a = &b - ti si promenio adresu pointera na adresu B

vrsta pointera je bitna za racunske operacije, znaci:

pokazivac_na_a++ // uvecava adresu za 1 INT (32-bita na x86)

*pokazivac_na_a++ // uvecava >A (to na sta pointer "pokazuje")< za 1


Dakle:

int *varijabla -- adresa koja pokazuje na neki integer

&variabla -- daje adresu neke varijable (pointer na)


-- Pointer na pointer

Isto, samo sto ne pokazuje na neku memorijsku lokaciju, vec pokazuje na novi pointer... tako mozes u nedogled :)

int *a;
int **b;

b = &a; -> b pokazuje na pointer a

[ Ivan Dimkovic @ 18.10.2002. 12:48 ] @
Dalje:

int niz[256];
int *nizptr;


nizptr = niz; // isto sto i nizptr = &niz[0];

*(nizptr + 4) = 5 // isto sto i niz[4] = 5;

*nizptr++; // uvecava memorijsku adresu niz[0] za 1

nizptr++; // ako je nizptr bila adresa od niz[0] sada je nizptr adresa od niz[1]

nizptr[5] = 0; // isto sto i niz[5] = 0, jer ptr[a] = b je isto sto i *(ptr + a) = b

&niz[n] znaci ADRESA OD niz[n]
niz[n] znaci VREDNOST OD niz[n]

znaci:

pravilno: nizptr = &niz[5] // nizptr sada pokazuje na niz[5]

nepravilno: nizptr = niz[5] // nizptr ce sada pokazivati na adresu koja je jadnaka vrednosti niz[5], a ako je to 0 onda mozes dobiti page fault ako se igras sa tom adresom ;-)


nizptr = malloc(sizeof(int)*256); // nizptr sada postaje pointer na novi memorijski blok od 256 intova

free(nizptr); // dealociras memoriju koju si alocirao sa malloc()

...



[ Ivan Dimkovic @ 18.10.2002. 12:57 ] @
// casting, short je 16-bita a int je 32-bita

int niz[256];
int *nizptr;
short *nizptr2;


nizptr = niz;
nizptr2 = (short *)niz;

nizptf2 + 16 je isto sto i niz + 8 jer je short 2 puta "kraci" od int-a

Pointerska aritmetika:

PTR + 1 je uvecavanje pointera za JEDNU "sirinu" (vrstu pointera)

nizptr++ uvecava nizptr pokazivac za jednu 32-bitnu adresu, tj za sizeof(int)

nizptr2++ uvecava nizprr2 pokazivac za jednu 16-bitnu adresu, tj za sizeof(short)


[ MAD-MAX @ 18.10.2002. 23:23 ] @
Necu reci nista sto bi bilo od koristi festis-swe-u ali Ivane, mislim da bi trebalo ova 3 posta da spojis, malcice sredis i postavis kao top temu. Pomoci ce mnogima.