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

Pokazivaci - malo pocetnih informacija :)

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pokazivaci - malo pocetnih informacija :)

[ Pregleda: 3583 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

korisnik07
student
Sarajevo

Član broj: 203947
Poruke: 75
92.36.168.*



Profil

icon Pokazivaci - malo pocetnih informacija :)14.05.2009. u 22:58 - pre 181 meseci
moze li mi neko pojasniti zasto ovo ne radi u banalnom primjeru koji zamijeni vrijednosti dva broja:

znaci, ovo ne radi:

Code:

void zamijeni(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}


a ovo, sa pokazivacima radi:

Code:
void zamijeni(int *px, int *py) {
int temp;
temp = *px;
*px = *py;
*py = temp;
}


Znaci malo pojasnjenje zbog cega ne radi prvo, i uopsteno ako moze nesto o pokazivacima, njihova primjena, uloga i to...
 
Odgovor na temu

jankie88
Igor Janošev
Beograd

Član broj: 22935
Poruke: 27
*.dynamic.sbb.rs.



Profil

icon Re: Pokazivaci - malo pocetnih informacija :)14.05.2009. u 23:38 - pre 181 meseci
Odgovor je vrlo jednostavan... U C-u se argumenti funkcije prenose preko vrednosti...

To znači sledeće: u prvoj funkciji se vrednosti parametara sa kojom si pozvao funkciju kopiraju u promenljive "x" i "y" (koje su jedinstvene za svaki poziv te funkcije) što znači da njihovom zamenom ti ne radiš ništa što će se odraziti van poziva te funkcije... U drugoj funkciji ti prosleđuješ 2 adrese koje pokazuju na cele brojeve (opet se kopira vrednost ali sada se kopira adresa), a u funkciji ti zamenjuješ vrednosti koje se nalaze na adresama koje su argumenti funkcije...

Još da napomenem da se pozivu druge varijante ove funkcije moraju proslediti adrese promeljivih koje hoćeš da zameniš, dakle:
Code:

int a, b;
a = 3; b = 7;
zameni(&a, &b);

ili
Code:

int *a, *b;
*a = 3; *b = 7;
zameni(a, b);

All it takes is one bad day to reduce the sanest man alive to lunacy!
That's how far the world is from where I am: Just one bad day...
 
Odgovor na temu

korisnik07
student
Sarajevo

Član broj: 203947
Poruke: 75
92.36.193.*



Profil

icon Re: Pokazivaci - malo pocetnih informacija :)16.05.2009. u 15:03 - pre 181 meseci
ok hvala, jasnije je :) ima li negdje skroz jednostavnih uradjenih primjera sa kombinovanjem funkcija i pokazivaca (npr. funkcija koja pokazuje adresu neke varijable i slicno)
 
Odgovor na temu

-jaskon-

Član broj: 182412
Poruke: 26
92.36.220.*



Profil

icon Re: Pokazivaci - malo pocetnih informacija :)26.05.2009. u 22:00 - pre 181 meseci
Molim vas ljudi moze li mi neko pojasniti ovo na par banalnih primjera, sad dolaze nizovi i vidim uglavnom se kombinuju sa pokazivacima koje jos nisam skuzio :S Znaci shvatio sam nizove ono bez pokazivaca, i njihov princip, ali pokazivace nisam, pa je li ima neki jednostavan primjer nizova i pokazivaca (kombinacija) a i onako samih pokazivaca opste primjene... Unaprijed hvala
 
Odgovor na temu

lestrigonac
Lestrigonac
Futog, Novi Sad

Član broj: 145470
Poruke: 247
*.adsl-a-1.sezampro.yu.



+2 Profil

icon Re: Pokazivaci - malo pocetnih informacija :)31.05.2009. u 17:08 - pre 181 meseci
Evo da ja pokusam :

Pokazivaci se definisu na sledeci nacin :
tip *ime //tip moze biti bilo koji od tipova podataka (int, char, short, float...)
Npr. char *a je pokazivac na tip char...

Pokazivaci su ako tako mogu da kazem "poseban tip promenljivih" (neka me neko ispravi ako gresim) koji sadrze adresu neke promenljive... Oni pokazuju na memorijsku lokaciju neke promenljive... Znaci ako ti definises char *a to ce predstavljati pokazivac na memorijsku lokaciju promenljive i ta promenljiva ce zauzimati onoliko koliko zauzuma char (1 bajt mada negde je i drugacije, to mozes da proveris sa sizeof(char) ).

Kada uradis operaciju a = &d; onda ce ovaj pokazivac da pokazuje na promenljivu d.

Kada uradis operaciju *a = c; onda u tu memorijsku lokaciju upisujes sadrzaj promenljive c... Ova operacija se naziva dereferenciranje... Takodje mozes sadrzaj te memorijske lokacije da iscitavas i upisujes u neku promenljivu c = *a;

Sto se tice nizova, samo ime niza (ako si npr. definisao niz kao a[10]) predstavlja pokazivac na prvi clan niza a[0](na pocetak samog niza)... Ja sam koristio pokazivace kada sam pravio funkcije kod kojih se argumenti prenose po referenci, a to znaci da pristupas direktno memorijskoj lokaciji promenljive i odmah je menjas, sto je zgodno kod npr. unosa clanova niza... Napravis funkciju unosa koja ce direktno da menja clanove niza, tacnije upisuje ono sto si ti zeleo :)...

/*funkcija za unos clanova niza(maksimalno neko MAX sto je npr. simbolicka konstanta)*/
void unos(int *a, int *n){
int i;

do{
printf("Unesite broj clanova niza (maksimalno %d) ", MAX);
scanf("%d", n);
}while(*n < 0 || *n > MAX); //ovde se koristi *n da bi se dobila vrednost n jer je ovde argument f-je pokazivac

for(i=0; i<*n; i++){
printf("Unesite clan a[%d] ", i);
scanf("%d", &a);
}
}

/*poziv te funkcije u main-u*/
int b[MAX]; //definisanje nekog niza
int n; //definisanje neke promenljive koja predstavlja broj clanova niza od maksimalno MAX clanova
unos(b, &n);//ovde se pise samo b jer je ime niza pokazivac na prvi clan i pise se &n da bi se prenela adresa od n...

Toliko za pocetak, nadam se da nisam negde pogresio i da sam sto je jasnije moguce objasnio...
Unapred se izvinjavam za moguce greske i ja sam ovo tek nedavno ucio... Bilo bi lepo da neko od starijih kolega ispravi eventualne greske...
Hvala unapred i veliki pozdrav...
Lestrigonac
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pokazivaci - malo pocetnih informacija :)

[ Pregleda: 3583 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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