Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 27.9.2017, 15:34   #1
milosh-96
Član
 
Član od: 28.6.2010.
Lokacija: Grocka
Poruke: 181
Zahvalnice: 28
Zahvaljeno 12 puta na 9 poruka
Određen forumom Pointeri, da li je ovo dobar primer?

Počeo sam da učim C jezik (već dosta dobro znam PHP i Python, i donekle Javu) i najviše me zbunjuju pointeri u C-u. Razumem da oni umestio vrednosti (value) skladište adresu u memoriji varijable na koju pokazuju. Nije mi jasno kada se primenjuju u praksi.

Zato sam napisao ovaj mali program u kojem koristim pointere.

Zanima me da li ovaj primer ima smisla, bar kada su pointeri u pitanju.

Šta program radi: Na početku timovi imaju početne bodove, nakon toga korisnik mora da izabere jedan od timova, zatim se broj poena za izabrani tim povećava za jedan i korisnik dobija rezultat.


Kod:
    #include <stdio.h>
    
    int main() {
        int *team_pts,defnum,input;
        defnum = 0;
        team_pts = &defnum;
        struct stats {
            int pts,wins,losses,draws,gs,gc,gd;
        };
        struct stats inter;
        inter.pts = 5;
        struct stats milan;
        milan.pts = 3;
    
        printf("Select your Team:\n1.Inter\n2.Milan\n");
        scanf("%d",&input);
        printf("*****************\n\n");
        switch(input) {
            case 1:
                team_pts = &inter.pts;
                break;
            case 2:
                team_pts = &milan.pts;
                break;
        }
    
        *team_pts += 1;
    
        printf("TEAM POINTS: %d",*team_pts);
    
        getchar();
        return 0;
    
    }
milosh-96 je offline   Odgovor sa citatom ove poruke
Stara 27.9.2017, 15:58   #2
Neutrino
Deo inventara foruma
 
Član od: 17.6.2011.
Poruke: 7.336
Zahvalnice: 94
Zahvaljeno 3.334 puta na 2.010 poruka
Određen forumom Re: Pointeri, da li je ovo dobar primer?

Pokazivači se koriste u slučajevima kada algoritam ili upotrebljene strukture podataka imaju koristi od direktne manipulacije memorijom. Recimo, strukture podataka kao što su ulančane liste (linked lists) i stabla (trees) za svaki element pored korisnog podatka sadrže i informacije o lokaciji elemenata u memoriji koji su na neki način funkcionalno povezani sa datim elementom (sledeći/prethodni element jednostruko/dvostruko ulančane liste, čvorovi binarnog stabla itd.).

Dakle, u situacijama kada algoritam može bez problema da koristi primitivne tipove podataka kao što su celi brojevi (int) itd. nema nikakvog smisla da se situacija komplikuje korišćenjem pokazivača na njih jer se pod haubom taj proces automatski odvija tokom prevođenja (kompajliranja) i izvršavanja.

Isto tako, pokazivači su nezamenjljiv alat kod algoritama koji koriste dinamičku alokaciju memorije (dynamic memory allocation).

Poslednja ispravka: Neutrino (27.9.2017 u 16:05)
Neutrino je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Neutrino na korisnoj poruci:
milosh-96 (27.9.2017)
Stara 27.9.2017, 21:22   #3
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.163
Zahvalnice: 2.079
Zahvaljeno 4.921 puta na 2.857 poruka
Određen forumom Re: Pointeri, da li je ovo dobar primer?

Drugi primer, funkcije koje operišu nad strukturama ili objektima neke klase, to jest primaju strukturu ili objekat kao argument.

Seti se da argumenti funkcije zapravo predstavljaju lokalne kopije prosleđenih vrednosti, npr:

Kod:
void f(int a)
{
    a = 10;    // 'a' je lokalna kopija prosleđenog 'int' argumenta, izmene se ne vide "napolju"
}

int main()
{
    a = 5;
    f(a);
    printf("%d", a);   // 'a' je ostalo 5

    return 0;
}
E sad, zamisli da funkcija 'f' umesto int-a prima celu strukturu ili objekat. Em što bi morala da se napravi kompletna kopija prosleđene strukture, em se ništa što bi radio sa članovima te strukture ne bi odrazilo na originalnu strukturu prosleđenu toj funkciji.

Ali zato funkcija može da primi pointer na strukturu ili objekat, i preko pointera da dohvati originalni objekat i direktno ga modifikuje. Plus nema nikakvog dodatnog kopiranja u memoriji.

Kod:
struct Osoba {
    char Ime[20];
    char Prezime[20];
};

void Funkcija1(struct Osoba o)
{
    strcpy(o.Ime, "Pera");
}

void Funkcija2(struct Osoba *o)
{
    strcpy(o->Ime, "Pera");
}

int main()
{
    struct Osoba A = { "Mile", "Kitić" };

    Funkcija1(A);   // Promeniće 'Ime' u lokalnoj kopiji unutar funkcije, nema efekta na strukturu A
    printf("%s", A.Ime);   // Ispisaće "Mile"

    Funkcija2(&A);   // Preko adrese će prići stvarnom objektu A i promeniti mu polje 'Ime'
    printf("%s", A.Ime);   // Ispisaće "Pera"

    return 0;
}
(U nekim drugim jezicima je ovo poznato kao "prosleđivanje argumenata po referenci" a ispod haube se implementira preko adresa objekta, odnosno pokazivača na objekat)
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 28.9.2017, 0:27   #4
Djordje Turjacanin
Deo inventara foruma
 
Član od: 15.6.2008.
Lokacija: Prnjavor, RS
Poruke: 3.872
Zahvalnice: 491
Zahvaljeno 1.031 puta na 664 poruka
Slanje poruke preko MSN-a korisniku Djordje Turjacanin Slanje poruke preko Skypea korisniku Djordje Turjacanin
Određen forumom Re: Pointeri, da li je ovo dobar primer?

Zamisli da imas neku ogromnu strukturu, npr. Niz od nekoliko hiljada intova, nekoliko hiljada double-ova i npr jedan int koji govori koliko ima elemenata koji nisu nula u tim nizovima. I sad imas jedan veliki niz elemenata takve strukture i hoces da ga sortiras po tome intu taj niz.

Kada ne bi koristio pokazivace, prilikom svake zamjene tri puta se kopira citava struktura koja je ogromna(jednom u privremeni element, jednom iz drugog u prvi i jednom iz privremenog u drugi) e sad zamisli koliko je to zahtjevno.

Medjutim, ako bi imao niz pokazivaca na elemente te strukture, prilikom zamjene ti ne kopiras citavu strukturu nego samo vrijednosti tri pokazivaca (tj. U sustini tri inta jer je pokazivac zapravo int). Eto to bi bio neki primjer upotrebe pokazivaca.
Djordje Turjacanin je offline   Odgovor sa citatom ove poruke
Stara 1.10.2017, 10:55   #5
Teva
Starosedelac
 
Član od: 23.2.2006.
Lokacija: Tamo gde su kuće od čokolade i prozori od marmelade....
Poruke: 1.579
Zahvalnice: 195
Zahvaljeno 301 puta na 171 poruka
Određen forumom Re: Pointeri, da li je ovo dobar primer?

Primer je lep, al nema smisla što se tiče pokazivača

Nema smisla jer ti koristiš pokazivač za vrednost kojoj direktno imaš pristup u kontekstu gde je menjaš, pa nema nekog preteranog smisla koristiti pokazivač za nešto što već imaš.

Da bi ih bolje razumeo i kad imaju smisla i kad nemaju, moraš malo da proučiš kako računar izvršava tvoj kod i kako se organizuje memorija. Sta je stack, sta heap (sto se tice memorije ne struktura podataka), stek okvire i sve ono što prati celu tu priču.

I to je zapravo ono što je veoma bitno, jer pokazivači umeju da budu bolni izuzetno, pogotovo ako ih ne razumeš kako treba, a da bi razumeo pokazivače i zašto se koriste i gde, moraš da razumeš kako radi računar.

Meni su oni počeli da imaju smisla tek kad sam lepo to izučio, pre toga su mi bili mehanizam da pristupim onome što mi "ne pripada"
Teva je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Tagovi
c jezik, pointer, primer

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Pentium G4400 koliko je dobar? Dare01 Osnovne komponente 28 7.12.2016 0:40
Dajte primer odgovora na pitanje za posao "Opišite nam tri tipa problema koje rado rešavat The Majk Brbljaonica 5 7.2.2015 17:13
Dobar program za prmenu fotografija? Pele10 Fotografija 6 19.12.2012 15:35
Dobar foto aparat za pocetnika Apostrof ŠDK - Foto i audio/video 5 11.4.2012 23:42
Trazim dobar monitor blabla21 ŠDK - Grafika 43 16.8.2011 22:06


Sva vremena su po Griniču +2 h. Sada je 13:54.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com