Osoittimien hyödyt?

tollero

Oon pari kertaa käyny c-kurssin ja vieläkään ei ole auennut osoittimet. Mitä hyötyä/etua näillä on ja mitä ei normaali muuttujilla voi tehdä?

18

286

    Vastaukset 18

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • hmhmhm

      Itsekkin olen aloittelija vasta, mutta tässä omia luulojani aiheesta.

      Osoittimen avulla voinee helposti toimittaa jonkin asian esimerkiksi funktiolle käsiteltäväksi, eli osoitin antaa vain muuttujan osoitteen, jotta funktio voi suoraan käsitellä muuttujaa vaikkei alkuperäinen muuttuja muuten olisikaan sen saavutettavissa. Näin muuttujaa ei tarvitse kopioida paikasta toiseen ja taas palauttaa. Tästä pitäisi tulla suorituskykyhyötyä.

      Sitten se ilmeisesti helpottaa muistin kanssa toimimista. Voit varata muistia joustavammin tarpeen mukaan.

      Sen avulla voinee myös rakentaa erilaisia tietorakenteita näppärästi. Linkitettyä listaa sun muuta? Mikä olisi huomattavasti vaikeampaa ilman osoittimia.

    • viittaus_toiseen

      Osoitin sisältää toisen muistipaikan osoitteen. Eli se voi olla esim. viittaus toiseen muuttujaan.
      Osoittimilla on paljon käyttöä silloin kun tehdään "oikeita" ohjelmia eikä mitään peruskoulun harkkoja.

    • 4or6

      Osoittimet ja viitteet ovat muten eri asia, kun puhutaan joistakin ohjelmointikielistä, kuten C . Erona on, että viitteiden semantiikkaa on yksinkertaistettu ja kääntäjä huolehtii itse asiassa "osoittamisen". No vaikka tämä on etu:
      void fun(uint8_t *fun_i)
      {
      *fun_i = 1;
      }

      int main(void)
      {
      uint8_t main_i = 0;

      fun(&main_i);
      }

      Tuo varaa main:ssa pinosta muuttujan ja välittää sen osoittimen välityksellä fun:lle. Fun kasvattaa muuttujaa yhdellä. Hienoa tässä on se, että muistin käyttöalue pysyy pienenä. Järkeä tässä ei niinkän kuitenkaan ole kuin esimerkillisesti: tuollainen inc-1 funktio kun tapahtuu suoraan reksiteritasolla ja sitä varten ei minkäänlaista strukturointia ole suotavaa tehdä - se hämää vain kääntäjää. Mutta jos osoittimen päässä olisikin esim. jokin struct:i, jossa on paljon jäseniä, voisi sen täyttäminen ollakin järkevää erillisessä funktiossa. Itse asiassa rakenteen kannattaisi olla sellainen, että täyttäviä funktioita olisi useita, jokainen nimetty järkevästi tekemänsä asian suhteen(ei fun_1_inc, vaan esim. ref_count_add). Funktioiden nimet kuvaisivat siis ylemmän tason logiikkaa ja structi itse datatyyppimäärittelyjä.

      • Juupa_juu

        Jassoo


    • Javaw

      Jos funktio ottaa parametrina tavallisen muuttujan, sille välitetään kopio muuttujasta, eli funktio ei muuta alkuperäisen muuttujan arvoa. Viittaus tai osoitin taas on muistiosoite, jolloin funktio voi muuttaa osoitteessa olevan muuttujan arvoa ja näinollen alkuperäisen muuttujan arvo muuttuu.

      Esimerkki:

      void kasvata(int luku) {
      luku ;
      }

      void kasvata_viittauksella(int &luku) {
      luku ;
      }

      void main() {
      int a = 10;
      kasvata(a);
      // a = 10;

      kasvata_viittauksella(b);
      // a = 11
      }

      • hmhmhm

        Juuri näinhän se tekee.

        Mutta kertokaapas miksi näin tehdään.


      • esierkkimerkki

        Yksi syy voisi olla esim. jos argumenttina annetaan muuttuja ja pitää saada takaisin useampi kuin yksi tulos.

        void pilko(uint32 muuttuja, uint8* t0, uint8* t1, uint8* t2, uint8* t3) {
        *t0 = (muttuja & 0x000000ff);
        *t1 =(muuttuja & 0x0000ff00) >> 8;
        *t2 =(muuttuja & 0x00ff0000) >> 16;
        *t3 = (muuttuja & 0xff000000) >> 24;
        }

        void main() {
        uint32 muuttuja = 0x12345678;

        uint8 t0, t1, t2, t3;

        pilko(muuttuja, &t0, &t1, &t2, &t3);

        printf("x ja x ja x ja x\n", t0, t1, t2, t3);

        // tulostaa 12 ja 34 ja 56 ja 78
        }


      • Bittinarkkari
        hmhmhm kirjoitti:

        Juuri näinhän se tekee.

        Mutta kertokaapas miksi näin tehdään.

        Aikoinaan jo Fortran-kielessä käytettiin ns. COMMON-blokkeja. Niiden tarkoituksena oli määritellä ne muuttujat, jotka olivat (haluttaessa) suoraan käytettävissä myös aliohjelmissa. Toisin sanoen aivan kaikkia muuttujia ei tarvinnut välittää aliohjelmille argumenttilistassa. Tämä oli erityisen hyödyllistä silloin, kun koko ohjelmisto käsitteli esimerkiksi jotain isonpuoleista taulukkoa (matriisia).
        Samoin C-kielen osoittimia käyttäen on mahdollista käsitellä aliohjelmissa (funktioissa) hyvin elegantisti vaikkapa suuria taulukoita (matriiseja) ilman, että niistä tehtäisiin jokaisella yksittäisellä kutsukerralla uusi kopio. Tuollaisen kopion teko kun vie kallista aikaa.


    • c-noviisi

      Mun mielestä osoittimien antaa tehokkaan tavan käyttää muistia juuri silloin kun ohjelmoija haluaa. Edut tulevat vastaan dynaamisessa muistinhallinnassa, tietorakenteissa ja isojen datamäärien käsittelyssä. Aina ei ole järkevää varata muistia pahimpaa tapausta varten.

    • pcmuseo
    • fgdijgjhc

      Osoittimet ovat tehokkaan ohjelmoinnin A ja O, joiden käyttö vaatii kohdeympäristön muistiarkkitehtuurin ymmärtämistä. Lelukielet, kuten C# (tai .NET ympäristö yleensä) on suunniteltu tolloja varten, joiden ymmärrys ei riitä osoittimia sisäistämään ja siksi näillä kielillä syntyy hitaita ala-arvoisia ohjelmia (siksi esim. kaikki kaupalliset isot softat tehdään C :lla).

      Todennäköisesti vielä tänäpäivänä koulussa opetetaan, että osoittimet ovat "pahasta", koska jo 90-luvulla Javan tullessa muotiin tätä samaa aivopesua harrastettiin...

      • tarkkana_kuin_porkkana

        Ei pelkästään osoittimilla pärjää. Ja saa niillä aikaan melkoisen spagetinkin. Toimivat tietorakenteet ovat hyvän toteutuksen perusta, johon toki myös osoittimia tarvitaan. Liialla osoittelulla saadaan aikaiseksi hidasta koodia, jonka lukeminen voi olla vieläpä epäterveellistä - ajatus karkaa helpommin, kun jokin osoitin on viattomasti väärin nimetty!


      • jkjhjhjk

        Oliko tämä vitsi? Taisi olla...


      • "Oliko tämä vitsi? Taisi olla..."

        Selvä provo tai vitsi :) Tuossa ei ollut nyt mitään järkeä... :)


      • "(siksi esim. kaikki kaupalliset isot softat tehdään C :lla). "

        Valhe. Melkoisen paljon isoista kaupallisista softista tehdään esim. Javalla tai PHP:llä. C on suosittu peleissä, laskennassa ja vanhoissa ohjelmissa jotka on sillä aikanaan tehty.

        "Todennäköisesti vielä tänäpäivänä koulussa opetetaan, että osoittimet ovat "pahasta", koska jo 90-luvulla Javan tullessa muotiin tätä samaa aivopesua harrastettiin..."

        Osoittimet tekee koodia helposti heikommin luettavaksi mutta ei ne nyt silleen pahasta ole. Niitä vaan ei juurikaan tarvitse kun eri alustojen natiiviympäristöissä joko ei käytetä osoittimia tai jos jossain on C komponenttia niin niitä on abstraktoitu aikoja sitten jemmaan, että sovelluksen koodissa niitä on vähän.


      • debian_xfce

        "Todennäköisesti vielä tänäpäivänä koulussa opetetaan, että osoittimet ovat "pahasta", koska jo 90-luvulla Javan tullessa muotiin tätä samaa aivopesua harrastettiin..."

        Ei jumankettu oli älyvapaata menoa 2000 luvun alussa, joka paikkaan javaa. Itse jouduin tunkemaan sitä windows mobileen ja tekemään c:llä natiivisti puolet. C osaaja kyllä tekee paremman softan c kielellä kuin kukaan javalla.


      • "Ei jumankettu oli älyvapaata menoa 2000 luvun alussa, joka paikkaan javaa."

        Kyllä se siihen aikaan eräänlainen "villitys" oli, pakko myöntää :) Tosiin puhtaampi olio kuin c ja hyvin OOP aukes javalla yliopistossa.

        "C osaaja kyllä tekee paremman softan c kielellä kuin kukaan javalla."

        Ei se kielestä ole kiinni, softasta ja koodarista enemminkin. Jos valkkaa väärän kielen taikka väärän tekijän väärään projektiin niin ei se kieli ratkaise....


      • purkkaviritystä_väliin

        Koodaajan pitäisi aina kuulla ensin mitä ollaan koodaamassa - ja määritellä sitten vasta kieli, millä se tehdään(tai jopa laiteympäristö). Se on hiukan arveluttavaa, että lehdessä haetaan koodaria tekemään kehitystä kielellä "X" - ei välttämättä osu kohdille tekijän ymmärrys alueen ekosysteemistä - saati sitten bisnes-toiminta-alueesta..


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Onko vassarin lääkkeet(mt) jääneet taas ottamatta

      Sen verran järjetöntä persuhuutoa taa näkyville. Tuo yksi häiriintynyt ei osaa kuin "huutaa" isoilla kirjaimilla, se on
      Maailman menoa
      47
      1492
    2. Olen nainen pahoillani, että tykkään sinusta niin paljon, että

      Haluaisin panna sua. Tuntuu vaan siltä, että olet sen suhteen ihan haluton. Ei minulle riitä pelkkä ystävyyssuhde.
      Ikävä
      59
      900
    3. Mieti oikeasti

      Ollaan lähes tuntemattomia, mutta samalla on tämä erityinen vuosien tilanne takana, joka on ollut monella tapaa väärin.
      Ikävä
      30
      667
    4. Taasko sä vedit

      Suojamoodin päälle? Miehelle
      Ikävä
      87
      637
    5. kene ajoi "kolarin"?

      "Punkaharjulla Luston ja Tuppuranmäen välillä sattui tiistaina aamupäivällä liikenneonnettomuus. Poliisin mukaan Savonl
      Savonlinna
      14
      605
    6. Tiedoksi yhdelle naiselle

      että mies lähestyy kaikin tavoin jos on kiinnostunut! 🙋🏻‍♂️
      Ikävä
      43
      583
    7. Pahin tapa satuttaa toista

      On jättää toinen vaille mitään vastausta. Erityisen kipeää se tekee sillon jos toinen ghostaa.
      Ikävä
      56
      574
    8. Liikenneonnettumuus

      Linkkari ja ruotsibiili törmäsivät linkku oli redun opetusajossa
      Ylitornio
      7
      552
    9. Puukotus Kajaanissa

      Kuka puukotti ja ketä? https://yle.fi/a/74-20247765 Vähemmän yllättäen päihteet mainittu
      Kajaani
      24
      531
    10. Minä kyllä odotan nainen

      että sinun kanssa voisin jutella asioista ihan oikeasti.
      Ikävä
      44
      521
    11. Alkaa jotenkin nyt kuvio hahmottuu täällä

      Sellainen vaikutelma tästä alkaa tulla, että täällä on joku pieni porukka, joka tuntee toisensa tai ainakin pelaa samaan
      Ikävä
      70
      520
    12. Mitä söpö

      Mies mietit?
      Ikävä
      61
      515
    13. Jos kaivattusi on

      Varattu niin miksi et antaisi asian olla hänen suhteen. Miksi ylipäätään vielä jatkat?
      Ikävä
      47
      513
    14. Miten uskallan sua nähdä

      Kun vaikutat suuttuneelta :(
      Ikävä
      37
      506
    15. Minulla on joskus ikävä sinua ja ajattelen sinua joskus.. edelleen

      Olin joskus niin rakastunut sinuun. Olin onnellinen, että kohdattiin ja kun vain tiesin sinun olevan olemassa. Täytit aj
      Ikävä
      14
      491
    16. Kylän tielle remonttia?

      Mitäköhän kylän tielle ruvetaan tekemään ku laitettu tuommoset töpsät muutamien suojateitten kohille?
      Hyrynsalmi
      13
      472
    17. Hyvä on sitten, jos et sitä s*ksiä halua kanssani.

      Rakastetaan vaan toisiamme, voin käydä muualla tyydyttämässä fyysisenpuolen tarpeet. Puhumalla tämäkin olisi selvinnyt.
      Ikävä
      132
      449
    18. 42
      428
    19. Nainen, tässä olen kahden vaiheilla

      Toinen pitäisi valita ja kummassakin on hyvät ja huonot puolensa. Toinen olisi sellainen pysyvä mutta työläs. Toinen taa
      Ikävä
      45
      409
    20. Miten vuosien jälkeenkin tunteet voivat olla niin voimakkaat?

      Että pelkkä ajatus sinusta täyttää silmät kyynelistä.
      Ikävä
      26
      399
    Aihe