[ k4rl0 @ 14.03.2006. 21:28 ] @
Moze li mi neko detaljno objasniti sto su pokazivaci i prikazati njihovu prakticnu primjenu.
Shvacam da pokazivaci zapravo pokazuju na neku adresu u memoriji,ali mi nije jasno kada se primjenjuju i cemu zapravo sluze.
Molim bez odgovora tipa google i bilo je vec na forumu.
Hvala
[ NrmMyth @ 14.03.2006. 22:08 ] @
pokazuju na pocetak nekog bloka u memoriji
:)
[ k4rl0 @ 14.03.2006. 22:17 ] @
Prakticna uporaba? ;)
[ maximus_1 @ 15.03.2006. 15:48 ] @
Može li netko dati neki primjer koda ali kod gui, a ne konzolnih aplikacija?
[ ljube @ 16.03.2006. 10:04 ] @
Primjer kako preko pokazivaca mjenjas vrijednost argumentima:

void test (int* x, int* y)
{
*x=5;
*y=22;
}

int var1 = 4;
int var2 = 17;

printf("vrednost prije var1=%d, var2=%d\n', var1, var2);
test (&var1,&var2);
printf("vrednost posle var1=%d, var2=%d\n', var1, var2);



[Ovu poruku je menjao ljube dana 16.03.2006. u 11:05 GMT+1]
[ k4rl0 @ 16.03.2006. 10:13 ] @
Zasto da napisem preko pokazivaca kad mogu i ovako:
x=5;
y=25;

Koja je razlika??
[ Pharos @ 16.03.2006. 10:32 ] @
Ako ne pišeš preko pokazivača, menja se samo vrednost (kopija) vrednosti x i y. Vrednosti var1 i var 2 ostaju nepromenjene.
Da bi promenio vrednosti var1 i var2 potrebno je da koristiš pokazivače.
Najprostiji primer ti je SWAP f-ja. F-ja koja zameni 2 broja.

Code:

void swap (int *px, int *py){
int temp;
temp = *px;
*px = *py;
*py = temp;
}


Ako ne bi radio s pointerima

Code:

void swap (int px, int py){
int temp;
temp = px;
px = py;
py = temp;
}


Promenio bi samo vrednosti px i py unutar samo f-je, a vrednosti x i y, odnosno var1 i var2 bi ostale nepromenjene.
Zato korisitiš pointer koji pokazuje na vrednosti var1 i var2 i samo preko njih možeš da promeniš njihove vrednosti unutar funkcije.

Mnoogo su opširni pointeri da bi ti to neko objašnjavao na forumu. Imaš pointer na neku vr. Pa pointer na pointer, pa pointer na funkciju, pa pointer kao argument f-je što je isto kao i "običan" pointer pa...

[Ovu poruku je menjao Pharos dana 16.03.2006. u 11:38 GMT+1]
[ k4rl0 @ 16.03.2006. 11:10 ] @
Posto su pokazivaci najveca prednost i mogucnost C++a imam velku volju ih naucit,pa..
Idem se primit knjige,nadam se da cu shvatit
Hvala na odgovorima,
Pozdrav
[ leka @ 16.03.2006. 13:27 ] @
Guglanjem za terminom "pokazivaci" dodje se do sledecih interesantnih linkova:
http://www.matf.bg.ac.yu/~gordana/op/BGLAVA10.pdf
http://student.foi.hr/~darados/pokazivaci/
[ X Files @ 16.03.2006. 14:23 ] @
Citat:

Ako ne pišeš preko pokazivača, menja se samo vrednost (kopija) vrednosti x i y.
Vrednosti var1 i var 2 ostaju nepromenjene. Da bi promenio vrednosti var1 i var2
potrebno je da koristiš pokazivače.


Postoji jos jedan *vazan* vid upotrebe pokazivaca kada se koriste za prenos
argumenata funkciji, a ne odnosi se na menjanje ili nemenjanje tih proslednjenih
podataka.

Brzina.

Kada se argumenti prenose preko pokazivaca - nema internog kopiranja tih
vrenosti u funkciji - pa je i kod brzi, pogotovo ako se radi o nekoj funkciji
koja se koristi u nekoj petlji.

Dakle, kada vidis nesto kao (const + pointer):

Code:

void funkcija ( const int *x, const int *y )
{
   // ...
}


To obicno znaci, "pointere koristim radi brzine a const da naznacim da x i y
nisu za menjanje."

Inace, pointeri pocetnicima nisu jasni jer su primeri u skoro svim knjigama koje
sam imao - totalno atipicni u realnom programiranju, pa stoga i ne ostavljaju
puno prostora da se dodje do nekog logicnog zakljucka.

[ system0verride @ 17.03.2006. 00:54 ] @
Hehe ne zaboravi osnovne strukture kao sto su lancane liste bez kojih ne moze :D,stabla,dvostruko povezane lan. liste....
[ NrmMyth @ 17.03.2006. 03:54 ] @
Te strukture se mogu napraviti i bez pokazivaca...
[ X Files @ 17.03.2006. 09:40 ] @
Lancane liste odavno podrzava STL standard, tako da je sve dovedeno na upotrebni nivo.

[ PeRuN_RoJs @ 15.04.2006. 11:17 ] @
Pa osnovna prednost lancanih lista je sto mogu biti "pretumbane" u memoriji...Ako se rade bez pokazivaca sve nekako gubi smisao...Zbog cega onda ne napraviti najobicniji niz bez obzira bila to lista, ili sablo, ili sta god...?Zaboravljate prednost pokazivaca da funkciji prosledi "pravi" parametar, tj. da funkcija radi direktno sa njim...Tako maltene svaka funkcija moze biti void, a vrednost odredjenog parametra (ukoliko se koriste pokazivaci, naravno) ce ipak biti promenjena......

[Ovu poruku je menjao PeRuN_RoJs dana 15.04.2006. u 12:18 GMT+1]
[ PeRuN_RoJs @ 15.04.2006. 11:21 ] @
Recimo :

Code:

void AddTwo (int *pointer)
{
*pointer+=2;
}

void main ()
{
int x=4;
AddTwo (&x);
printf ("%i",x);
}


Dakle ispisuje 6!Zar ne?

=]

[Ovu poruku je menjao PeRuN_RoJs dana 15.04.2006. u 12:24 GMT+1]
[ leka @ 17.04.2006. 16:27 ] @
Mala digresija - "pointeri" nije engleska rec, vec srpska/hrvatska/srpskohrvatska (kako ko voli). Egleska rec bi bila "pointers".
[ PeRuN_RoJs @ 17.04.2006. 16:37 ] @
Ako cemo bas da "cepidlacimo", nije ni srpska vec uvedenica iz engleskog...

[ @zrael @ 18.04.2006. 21:51 ] @
pokusat cu malo razjasniti stvar. Oni su jedna mala zajebana stvar. i najcesce se na njima grijesi. Ako ih se nauci koristiti, nevjerojatno su mocna stvar. Po meni ih je najbolje koristiti za nabrijavanje algoritma pošto s njim imate direktni pristup radnoj memoriji. U kombinaciji sa struct-ovima su zaista nevjerojato močna stvar. Sa Structovima i pointerima pravis direktne vezane liste ili bilo koje strukture podataka. Kako ces ti to sve primjenjivat, ovisi o samom zadatku koji imas za ispunit. U vecini slucajeva ti se obrada podataka svodi na rad s poljima. Problem u poljima je taj sto tocno morac odrediti kolicinu polja koju ces koristiti kao maximalni broj. S strukturama podataka, koje stvarujes pomocu pointera, nisi limitiran memorijom koju si alocirao preko polja nego mozes ici u beskonacnost (velicina memorije). Sa pointerima tako sa vezanom listom mozes mnogo brze sortirati elemente u mnogo manje koraka nego sto bi to mogao sa poljima.
npr: Enigma- simulator kriptografskog stroja iz 2. sv rata
Ona ima 3 rotora koji svaki ima po dvije abecede od 26 elemenata te slican reflektor te slicane utikace. radi se o tome da to rijesavas poljima, ti svaku promjenu vrijednosti moras praviti neko prepisivanje iz varijable u varijablu. Svako to prepisivanje ima niz koraka koje komp mora odraditi. Pointerom ti samo preusmjeravas vrijednosti. Radit ce ti brze zato sto je preusmjeravanje pointera manje zahtjevno za komp nego kopiranje iz varijable u varijablu
[ z@re @ 18.04.2006. 22:20 ] @
Citat:
@zrael: Problem u poljima je taj sto tocno morac odrediti kolicinu polja koju ces koristiti kao maximalni broj. S strukturama podataka, koje stvarujes pomocu pointera, nisi limitiran memorijom koju si alocirao preko polja nego mozes ici u beskonacnost (velicina memorije).


Jesi ti cuo za dinamicko alociranje i dinamicko realociranje?
[ reject @ 19.04.2006. 09:56 ] @
A sta ti hoces da kazes sa tim tvojim "jesi cuo ti za..." pitanjem?
Citat:
@zrael:S strukturama podataka, koje stvarujes pomocu pointera, nisi limitiran memorijom koju si alocirao preko polja nego mozes ici u beskonacnost (velicina memorije).

Ocigledno da je cuo, jer iz ovog gore sledi da zna da alocira jos memorije kad mu treba.

Mislim, nije to najsrecnije napisan post na svetu, daleko od toga, ali cemu takvo pitanje kad nisi ni procitao sve?
[ @zrael @ 20.04.2006. 19:30 ] @
ti i kad dinamicki alociras memoriju, npr za neki string ipak moras unijeti odredjenu duzinu znakova koja ce biti maksimalna. Ako uneses npr256 znakova. on ce koristiti koliko ti treba, ali ce maksimalan broj znakova opet biti 256
[ opmo @ 24.11.2006. 00:00 ] @
Da li je pozeljno uvek alocirati memoriju za svaki pokazivac ?
[ rumpl @ 24.11.2006. 14:52 ] @
Ako deklarises neki pointer koji ce ti koristiti za kopiranje jednog pointera, onda ne sluzi ni cemu da alociras memoriju.

Primer:

Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *good_to_up(char *str)
{
  char *tmp;

  /* Pravim kopiju str-a da ne bih izgubio adresu gde se string nalazi 
  ** Nema potrebe da se malloc-uje zato sto pravimo samo kopiju str-a, tj
  ** kopiju adrese gde se nalazi string
  */
  tmp = str;

  while(*str != '\0')
    {
      if((*str >= 97) && (*str <= 122))
    *str = *str - 32;
      
      str++;
    }

  /* Vracam staru adresu str-a, tamo gde pocinje string */
  return(tmp);
}

char *bad_to_up(char *str)
{

  while(*str != '\0')
    {
      if((*str >= 97) && (*str <= 122))
    *str = *str - 32;
      
      str++;
    }

  /* Primetices da ovde vracamo adresu: str + strlen(str), zato sto smo presli preko celog
  ** stringa, a nismo sacuvali adresu gde se nalazi string 
  */
  return(str);
}

int main(int argc, char *argv[])
{
  char *str;

  str = malloc(10);

  read(1, str, 10);

  printf("||%s||\n", good_to_up(str));
  printf("||%s||\n", bad_to_up(str));
  
  return(0);
}


U mom primeru je cak greska alocirati memoriju za tmp. Ako alociras, ta memorija ce biti neupotrebljena, tj. onaj poznati memory-leak.
[ DjoleReject @ 24.11.2006. 15:13 ] @
@ NrmMyth - Kako to mislis da se liste prave bez pointera??? Ja ne znam za to.

Zar ne moras imati nesto u svakom clanu liste i pointer ne sledeci clan, da bi imao najjednostavniju jednoulancanu listu, a za bilo sta komplikovanije treba i vise pointera. Ovo je nacin koji ja koristim, a ako postoji neki drugi - nikad nisam ni cuo za to!!!

Objasnjenje bih molio, jer sam malo sokiran ovime.
[ rumpl @ 24.11.2006. 23:35 ] @
Ja bih rekao da ne obicne liste ne mogu da se urade bez pointera.
[ DjoleReject @ 26.11.2006. 15:14 ] @
Pa i ja nesto prebacujem po glavi, ali nista mi ne pada na pamet... A na kakve liste mislis kad kazes "obicne"? Kakve bi bile drukcije? Kako god da ih ulancas - mora pointerima.
[ rumpl @ 26.11.2006. 17:38 ] @
Pa ono, ne cirkularne, double linked i to.
Obicne... Najobicnije... :D
One sto vas uce prvo na faksu
[ DjoleReject @ 26.11.2006. 20:07 ] @
Najjednostavnija:

Code:
struct Elem{
NekaKlasa nekiObjekat;
Elem* next;
};


Znaci - nema jednostavnije, a da ja znam za to.
[ rumpl @ 26.11.2006. 23:51 ] @
To.
[ rumpl @ 05.12.2006. 19:29 ] @
@ NrmMyth : Ja jos uvek cekam tvoj primer lista bez pointera...
[ NrmMyth @ 05.12.2006. 22:25 ] @
Napravi si svoju 'memoriju'.
Code:
static vector<T> mem;


Sad vise ne pokazujes s pokazivacima nego s int-om.

Add bi izgledao ovako nesto:
Code:
Cvor Add( T x )
{
    mem.push_back( x );
    return Cvor( mem.size()-1 );
};


Samo stvar jezicne konstrukcije i primjera radi. Hocu reci nije pametno...
[ rumpl @ 06.12.2006. 09:05 ] @
Pa cekaj, ovo nije C...
[ NrmMyth @ 06.12.2006. 09:25 ] @
ista stvar je...