Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pokazivaci - molim objasnjenje

[es] :: C/C++ programiranje :: Pokazivaci - molim objasnjenje

[ Pregleda: 2819 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mix5
Milos Djuric
STE, Asseco
Jagodina

Član broj: 14282
Poruke: 332
*.ptt.yu.



Profil

icon Pokazivaci - molim objasnjenje11.06.2006. u 03:58 - pre 217 meseci
Code:
#include <stdio.h>
main(){
       int a[] = { 0, 1, 2, 3, 4 };
       int *b[] = { a, a+1, a+2, a+3, a+4 };
       int **c = b;
       int i = 0;
       while (c-b != 5){
                        if(c-b > 5) c -= 5;
                        **c = *(a + 4 - i);
                        c += 2; i = (i + 2)%5;
                        }
       for(c--; c>b; c--) printf("%d", **c);
}


Molim da mi neko detaljno objasni ovaj programcic.
 
Odgovor na temu

Igor Gajic

Član broj: 93194
Poruke: 747
*.ADSL.neobee.net.



+987 Profil

icon Re: Pokazivaci - molim objasnjenje11.06.2006. u 14:36 - pre 217 meseci

HM, prilicno komplikovan program, koji zahteva odlicno poznavanje pokazivaca i aritmetike doticnih.

Code:

int *b[] = { a, a+1, a+2, a+3, a+4 };


b je niz pokazivaca na integere. Moze se zapisati i malo drugacije:
Code:

int *b[] = { &a[0], &a[1], &a[2], &a[3], &a[4] };


Zatim:

Code:

int **c = b;


Deklarises c kao pokazivac na pokazivac na niz integera.
c sadrzi adresu pokazivaca b.
*c sadrzi adresu niza b.
**c sadrzi elemenat *b[0]

Code:

while (c-b != 5)


Znaci ponavljas petlju sve dok razlika adresa c i b ne bude bila ==5, tj dok c ne bude pokazivao na *b[5]!!!!

Code:

if(c-b > 5) c -= 5;


Ukoliko je razlika izmedju adresa c i b veca od 5 onda smanjujes c za 5, tako da c i dalje pokazuje
na niz b.

Code:

**c = *(a + 4 - i);


Elementu niza *b[] na koji pokazuje c dodeljujes vrednost elementa a[4-i].

Code:

c += 2; i = (i + 2)%5;


Pokazivac c efektivno pomeras za dva mesta, tj ako je pokazivao na *b[0] sada pokazuje na elemenat *b[2].
I naravno i povecavas za 2, pa moduo 5.


Code:

for(c--; c>b; c--) printf("%d", **c);


Na izlazu iz petlje c je pokazivao na *b[5]. Po inicijalizaciji for petlje c se smanjuje za 1 pa sada pokazuje na
*b[4].
Zatim proverava da li je c stigao do *b[0], ako nije stampa elemenat na koji pokazuje c. Smanjuje c za jedan,
efekat kao gore.

Ovaj for u sustini ispisuje niz b[4],b[3],b[2],b[1].



I jos jedan savet za kraj.

Ako imas ovako neki zadatak sa pokazivacima koristi Debug opciju kompajlera, dodaj watch za sve vaznije
promenljive i onda prolazi kroz program korak po korak. Sa malo strpljenja shvatices logiku programa i sto je
jos vaznije lakse ces nauciti pokazivace i njihovu logiku.

Pozdrav

[Ovu poruku je menjao Igor Gajic dana 11.06.2006. u 20:21 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pokazivaci - molim objasnjenje

[ Pregleda: 2819 | Odgovora: 1 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.