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

Koja je ustvari primena pointera?

[es] :: C/C++ programiranje :: C/C++ za početnike :: Koja je ustvari primena pointera?

[ Pregleda: 4934 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.88.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon Koja je ustvari primena pointera?12.08.2007. u 16:45 - pre 202 meseci
Primetio sam u mojoj knjizi da za sve imaju pointeri:

pointeri za klase, pointeri za funkcije, za obicne varijable, za structure... cemu sve to koja je njihova prednost???
 
Odgovor na temu

prog
Bihac

Član broj: 106882
Poruke: 77
*.PPPoE-7401.sa.bih.net.ba.



Profil

icon Re: Koja je ustvari primena pointera?12.08.2007. u 16:58 - pre 202 meseci
Jako puno prednosti pointeri posjeduju. Ja bih sada samo iznio samo jednu a to je da stede memoriju.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.hsd1.ma.comcast.net.



+6 Profil

icon Re: Koja je ustvari primena pointera?12.08.2007. u 17:52 - pre 202 meseci
http://www.codeproject.com/cpp/pointers.asp
 
Odgovor na temu

vladaboy93
Vladimir Makaric
Novi Sad

Član broj: 137777
Poruke: 376
*.181.eunet.yu.

Sajt: vladimirmakaric.110mb.com


Profil

icon Re: Koja je ustvari primena pointera?12.08.2007. u 17:55 - pre 202 meseci
Ok to ali d ali ima nekih konkretnih razloga zbog cega se oni koriste...
 
Odgovor na temu

milanche
San Francisco

Član broj: 2447
Poruke: 1200
*.hsd1.ca.comcast.net.



+1001 Profil

icon Re: Koja je ustvari primena pointera?12.08.2007. u 17:56 - pre 202 meseci
Stojis na Slaviji i cekas bus. Prilazi ti covek i pita gde je palata 'Beogradjanka'.

Za odgovor imas tri opcije:
1) uperis prst (pointer, pokazivac) u pravcu palate i kazes 'eno je tamo'
2) uhvatis coveka za ruku i odvedes ga do palate i kazes 'evo ovde' a zatim se vratis da cekas bus
3) kazes coveku da saceka, odes do palate, natovaris je na ledja, doneses je do coveka i kazes - evo je, zasta ti je trebala ?

Salu na stranu, pointeri/pokazivaci postoje odkada i programski jezici, a poticu od same fizike memorijskih cipova koji identifikuju
pojedine memorijske lokacije pomocu njihovih adresa. Cinjenica je da kompajler sa svakom promenljivom (bez obzira kako je
i gde ti deklarisao) operise preko njene adrese. Deklarisanje promenljive (napr: int x; float y; ) je samo olaksica za programera, i u
nekim jezicima programer ne mora ni da zna adresu promenljive.

Evo nekih primera gde upotreba pointera ima smisla:

Primer 1:

Ako treba dugacak niz memorijskih lokacija da obradis na isti nacin (recimo memorijski prostor od 2MB koji sadrzi piksele neke slike)
primitivan nacin bi bio ovo (pisano u izmisljenom pseudokodu):

Code:

           uradi nesto sa memorijskom lokacijom na adresi 0x00000000;
           uradi nesto sa memorijskom lokacijom na adresi 0x00000001;
....      
....
           uradi nesto sa memorijskom lokacijom na adresi 0x001FFFFF;       


Ovo zahteva 2 miliona individualnih instrukcija, sedam sati provedenih za tastaturom da bi ukucao program uz enormnu priliku
da se nesto pogresno ukuca, i ocito je vrlo glupo i neefikasno u svakom pogledu.

Ako se dosetis pa rezervises jednu memorijsku lokaciju da sadrzi adrese (sto je pointer po definiciji), onda sve mozes da uprostis
(opet pisano u pseudo kodu):
Code:

          addr = 0x00000000;
          petlja:
                    uradi nesto sa memorijskom lokacijom na adresi sadrzanoj u addr;
                    inkrementiraj addr (povecaj za 1)
                    ako je (addr > 0x001FFFFF) izadji iz petlje;
                    u protivnom, vrati se ponovo na petlju

                  


Dakle, ocito upotreba posebne memorijske lokacije za adresu promenljive cini kod elegantnijim i smislenijim.

Primer 2:

Nekoj funkciji treba da dostavis veliku kolicinu podataka naredjanih sekvencijalno jedno do drugog u memoriji.

Ocito je da je najlakse funkciji dostaviti pocetnu adresu prvog podatka (pointer na pocetak), ukupan broj podataka, kao i tip podatka
(tj. koliko bajtova svaki podatak zauzima). Na ovaj nacin dostavio si samo tri informacije (sto je usteda i u kolicini prenetih bajtova
i u vremenu potrosenom da se to prenese) a opet je poznato sve sto treba, sve zahvaljujuci upotrebi pointera.

Primer 3:

Pointeri mogu da pokazuju ne samo na podatke, nego i na kod (instrukcije) - to su tzv. function pointeri i/ili labele.
Upotrebom istih u nekom algoritmu se lako i elegantno programatski odredi koju tacno funkciju pozvati u kom slucaju.

To bi bilo ukratko - primera ima koliko god hoces.

[Ovu poruku je menjao milanche dana 12.08.2007. u 22:14 GMT+1]
 
Odgovor na temu

Časlav Ilić
Braunšvajg, Nemačka

Član broj: 4945
Poruke: 565
*.pool.mediaWays.net.



+27 Profil

icon Re: Koja je ustvari primena pointera?13.08.2007. u 11:03 - pre 202 meseci
Na pokazivače se može gledati sa stanovišta koncepta, i tehničke izvedbe. I zaista, kada se priča o pokazivačima u c/c++, obično se težište stavlja na tehničku izvedbu (kao npr. u ovom tekstu što je Dragi Tata ostavio), dok se konceptualni deo („čemu to?“) nekako podrazumeva.

A konceptualno značenje je vrlo prosto, ali izvanredno važno: pokazivači su potrebni kada se želi istom podatku pristupiti preko dva ili više različitih imena. Milanče je naveo neke primere kada je to poželjno. Drugim rečima, o pokazivaču treba razmišljati kao o „imenovanju podataka“, dok je „adresa podatka u memoriji“ nešto uži pojam.

Stoga su pokazivači zapravo izuzetno rasprostranjeni u programskim jezicima, samo se tehničke izvedbe razlikuju — kako se stvaraju, kako se vezuju za podatke, itd. Ja ne znam ni za jedan popularniji jezik danas koji ne koristi pokazivače, u navedenom smislu „više imena za isti podatak“ (ne znam ni da li je moguće ne koristiti ih :) Čak ih i fortran 77 koristi za prosleđivanje argumenata funkcijama, a pri čistom funkcionalnom programiranju (recimo u lispu/šemi, kada se želi) podrazumevaju se bez osvrtanja.

Bar se meni čini da se priča o pokazivačima, potreba za njima i primeri upotrebe, mnogo lakše uviđaju kada se bistre viši jezici od c/c++, kao što su trenutno rasprostranjeni java, piton, perl, rubi, ili neke drevne zveri, poput lispa. Pošto svakako dobro dođe da se zna neki skriptni jezik, onda preporučujem izučavanje pitona, kao izgleda najpopularnijeg, i usput će se „primiti“ i namena pokazivača.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.252.119.*



+2789 Profil

icon Re: Koja je ustvari primena pointera?13.08.2007. u 11:27 - pre 202 meseci
Dat je zadatak. Sa ulaza se najpre prihvata priridan broj n, a potom niz od n realnih brojeva. Ispisati te brojeve u neopadajućem redosledu.

Primetimo da ovde nije rečeno koliko članova može imati ulazni niz, tj. koliko može biti n. Dakle, nije ti poznato koliko će prostora biti potrebno za smeštanje niza. Tada možeš da pretpostaviš koliko može najviše biti članova niza i da definišeš niz tolike dužine. Međutim, tu nastaje problem izbora te maksimalne veličine. Ako je premala, može se desiti da korisniku zatreba još. Ako je prevelika, taj prostor će uvek kada se program izvršava biti rezervisan, bez obzira koliko je za obavljanje zadatka zaista potrebno. Bolje rešenje je rezervisati onoliko memorije, koliko je u tom trenutku zaista potrebno.
Code:

double *p;
unsigned long int n;

cin >> n;
p = new double[n];

U takvim situacijama su pokazivači neophodni. Naravno, ti možeš da koristiš neku klasu koja već obavlja takav posao (kao vector<double>) i da ne vidiš pokazivače, ali oni su implicitno prisutni kroz upotrebu te klase.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

markojo
Beograd

Član broj: 118002
Poruke: 13
*.ikomline.net.



+1 Profil

icon Re: Koja je ustvari primena pointera?20.09.2007. u 07:56 - pre 201 meseci
Da malo prosirimo...

Koja je primena pokazivaca na pokazivac a koja pokazivaca na niz pokazivaca ?
Koliko sam primetio pokazivac na niz pokazivaca mora biti definisan za odredjen broj, npr:
Code:

Predmet *p[100];

Pok na pok bi mogao da funkcionise kao pokazivac na niz pokazivaca uz mogucnost dinamicke dodele memorije...

Code:

int n = 5;
Predmet **p;
p = new Predmet*[n];

Da li ima neke druge prednosti i vece razlike ?




U resenju jednog zadatka (Laslo Kraus) sam naisao na nesto tipa:
Code:

Tabla ***t;

pa uvidjam da se bez visestrukih pokazivaca ne moze u C++ u !
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Koja je ustvari primena pointera?20.09.2007. u 08:58 - pre 201 meseci
Vrlo jednostavno...

1. Preko pokazivača alociraš točno onoliko memorije koliko trebaš (dinamička alokacija). U suprotnom, ako koristiš statičku alokaciju može ti se desiti da polje ima npr. premalo ili previše elemenata. Ako ima premalo onda ti je ono beskorisno, a ako ima previše onda bacaš memoriju, a preko pokazivača si alociraš točno onoliko koliko želiš.

2. Preko pokazivača vršiš direktnu komunikaciju među funkcijama. Naime, sve varijable postoje samo u memorijskom prostoru svoje funkcije, a ukoliko im želiš pristupiti iz neke druge funkcije to jedino možeš preko adrese tj. pokazivača.
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
161.53.237.*



+9 Profil

icon Re: Koja je ustvari primena pointera?20.09.2007. u 09:12 - pre 201 meseci
Citat:
markojo: Da malo prosirimo...

Koja je primena pokazivaca na pokazivac a koja pokazivaca na niz pokazivaca ?
Koliko sam primetio pokazivac na niz pokazivaca mora biti definisan za odredjen broj, npr:
Code:

Predmet *p[100];

Pok na pok bi mogao da funkcionise kao pokazivac na niz pokazivaca uz mogucnost dinamicke dodele memorije...

Code:

int n = 5;
Predmet **p;
p = new Predmet*[n];

Da li ima neke druge prednosti i vece razlike ?




U resenju jednog zadatka (Laslo Kraus) sam naisao na nesto tipa:
Code:

Tabla ***t;

pa uvidjam da se bez visestrukih pokazivaca ne moze u C++ u !


Pokazivač na pokazivač koristiš npr. kod dinamičke alokacije 2D polja. Prvi pokazivač zapravo predstavlja alokaciju za retke, a drugi za stupce svakog pojedinog retka. Npr.:

Code:

int** polje;
int red, stup, i, j;

cout<< "Unesite broj redaka i broj stupaca 2D polja: ";
cin>> red >> stup;

polje = new int* [red];       // polje pokazivaca (redci)
for (i = 0; i < red; i++)     // za svaki redak alociraj... 
    polje[i] = new int[stup];   // ... sve stupce


Tako koristiš i trostruki pokazivač kada alociraš 3D polje itd itd. U pravilu, koliko imaš pokazivača toliko imaš i dimenzija polja. Dvostruki pokazivač koristiš i kada pokazivač predaješ funkciji preko call by reference:

Code:
void promijeni(int **x, int **y)
{
    int *z = *x;    
    *x = *y;    
    *y = z;           
}


Primjerice, ova funkcija mijenja pokazivanje dvaju pokazivača. Dvostruki pokazivači se koriste i kada se radi s vezanim listama, a negdje su i obavezni kao npr. kod dinamičke alokacije više objekata VCL tipa kada je riječ o Borlandovim alatima.


 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.252.119.*



+2789 Profil

icon Re: Koja je ustvari primena pointera?20.09.2007. u 13:11 - pre 201 meseci
Hteo bih da dopunim i prokomentarišem poslednji itf-ov primer.
Code:

void zamena(int *x, int *y)
{
    int priv = *x;
    *x = *y;
    *y = t;
}

...

int a = 7, b = 2;
zamena(&a,&b);
/* nakon ove naredbe je a==2 && b==7 */

Ovo je takozvano prosleđivanje parametara po adresi, odnosno po referenci, po imenu, nasuprot prenošenju po vrednosti. Promenljivu možeš zamisliti kao neki papir na kome nešto piše. Prenošenje po vrednosti možeš zamisliti na sledeći način. Ti (kao funkcija) treba da uradiš nešto sa sadržajima papira. Ja (koji te pozivam) najpre prepisujem sadržaj tog papira na neki drugi da bi ti radio sa tim drugim papirom ne dirajući originale. U slučaju prenošenja po adresi ja ti dajem baš originale da radiš sa njima i da eventualno možeš i da im izmeniš sadržaj. No, konstante, kao što je 19, ne mogu se prenositi po adresi. itf-ov primer je sličan ovom, s tim da se umesto tipa int koristi int* (i samim tim, umesto int* koristi se int**). Dok moj primer radi sa celobrojnim, njegov radi sa pokazivačkim promenljivama. Navešću još jedan primer koji ilustruje vraćanje rezultata po adresi.
Code:

int* manji(int *x, int *y)
{
    if (*x<*y)
        return x;

    return y;
}

...

int a = 7, b = 2;
*manji(&a,&b) = 5;
/* nakon ove naredbe je a==7 && b==5 */

Ovi primeri rade kako u jeziku C, tako i u jeziku C++. Međutim, sa se ne bi po celom programu ovako nezgrapno "vukli" simboli & i *, C++ ima elegantnije rešenje, a to su upućivanja ili reference. Napisaću prethodni primer preko njih.
Code:

int& manji(int &x, int &y)
{
    if (x<y)
        return x;

    return y;
}

...

int a = 7, b = 2;
manji(a,b) = 5;
// nakon ove naredbe je a==7 && b==5

Lepše izgleda, nema šta. Rezultat prevođenja u oba slučaja je potpuno isti niz mašinskih naredbi, tako da nema nikakve razlike u efikasnosti, već samo u čitljivosti i elegantnosti.

No, upućivanja ne mogu u potpunosti zameniti pokazivače. Kada se piše program koji manipuliše količinom podataka koja nije poznata programeru u fazi pisanja programa, moraju se koristiti pokazivači, pa nisu izbačeni iz upotrebe u jeziku C++. No, za prosleđivanje parametara i vraćanje rezultata po adresi se upućivanja koriste kao elegantnije rešenje.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Koja je ustvari primena pointera?

[ Pregleda: 4934 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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