C pointer merkitys?

outo-juttu

Mikä mahtaa olla C kielessä pointerien merkitys? Olen ymmärtänyt että pointer on muistipaikka johon on tallennettu jonkin toisen muistipaikan osoite. Mitä järkeä tässä on? Miksi koodissa ei käytettäisi suoraan sitä muistipaikkaa jota haetaan?

43

740

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • C-kielessä osoitin on muuttuja mikä osoittaa muualle. Sitä käytetään kun tarvitaan syystä tai toisesta käyttää samaa instanssia jostain rakenteesta. Eli on vaikka jokin rakenne missä tieto kertaalleen ja samaa rakennetta sitten näpelöidään useammassa paikassa.

      Muutenhan se on sitä, että välitetään funktiolle argumentit ja palautetaan laskennan tulos, ja näin se yleensä tehdäänkin mutta joissakin jutuissa tieto on kertaalleen muistissa ja siihen viitataan osoittimella.

      • outo-juttu

        Niin mutta miksi käyttää pointeria? Eikös saman saavuta jos käyttää suoraan muuttujan nimeä, ilman että pointer on siinä välissä? Jos tarvitaan juttu jossa tieto on kertaalleen muistissa niin eikös saman asian aja extern muuttuja tai static?

        Mikä olisi sellainen loistava esimerkki jossa pointerin hyöty tulisi esiin?


      • outo-juttu kirjoitti:

        Niin mutta miksi käyttää pointeria? Eikös saman saavuta jos käyttää suoraan muuttujan nimeä, ilman että pointer on siinä välissä? Jos tarvitaan juttu jossa tieto on kertaalleen muistissa niin eikös saman asian aja extern muuttuja tai static?

        Mikä olisi sellainen loistava esimerkki jossa pointerin hyöty tulisi esiin?

        C:llä ei ole mahdollista varata keskusmuistia dynaamisesti ilman osoittimia. Eli siis jos nyt halutaan vaikka gigan muistialue leikittäväksi niin osoitinta tarvitsee.

        Dynaamiselta muistinvaraukselta ei voi myöskään voi välttyä kaikissa tilanteissa joissa staattinenkin muistinvaraus toimisi, sillä kovin isoja muistialueita ei voi varata pinosta tai tulee pinon ylivuoto.

        Siltä osin olet oikealla jäljillä, että tietysti niitä osoittimia vältetään ohjelmoinnissa yleisesti.


      • öönotota

        Jos on vaikkapa suht. iso muistialue, joku datastruktuuri tms., jota on tarpeen käsitellä esim. eri funktioissa, taskeissa tms., niin on paljon tehokkaampaa välittää toiseen paikkaan vain sen datan osoite kuin koko data. Jos on vaikka se gigan muistialue, niin ei tarvitse kopioida koko gigaa toiseen kohtaan muistissa, vaan vain se pointteri, joka kertoo mistä osoitteesta se giga löytyy. Vastaavaa tapaa voidaan käyttää muissakin kielissä sisäisesti ilman että puhutaan pointtereista, mutta C:ssä pointteri on se tapa, jolla tämä tehdään.


      • The_Real_J
        outo-juttu kirjoitti:

        Niin mutta miksi käyttää pointeria? Eikös saman saavuta jos käyttää suoraan muuttujan nimeä, ilman että pointer on siinä välissä? Jos tarvitaan juttu jossa tieto on kertaalleen muistissa niin eikös saman asian aja extern muuttuja tai static?

        Mikä olisi sellainen loistava esimerkki jossa pointerin hyöty tulisi esiin?

        Reaalimaailman termeillä: jos sinulle on lähetys postissa onko järkevämpää lähettää sinulle sen postilokeron numero, jossa lähetys on, vai tunkea koko postitoimisto kaikkine virkailijoineen ja säilytystiloineen postiluukusta sisään ? Ensimmäinen vaihtoehto vastaa osoittimen käyttämistä, toinen arvon antamista sellaisenaan.


      • outo-juttu
        The_Real_J kirjoitti:

        Reaalimaailman termeillä: jos sinulle on lähetys postissa onko järkevämpää lähettää sinulle sen postilokeron numero, jossa lähetys on, vai tunkea koko postitoimisto kaikkine virkailijoineen ja säilytystiloineen postiluukusta sisään ? Ensimmäinen vaihtoehto vastaa osoittimen käyttämistä, toinen arvon antamista sellaisenaan.

        Ymmärsin kyllä mikä pointer on. En vain keksi millaisessa tilanteessa siitä olisi hyötyä. Esimerkkikoodi

        int x, i;
        int *p;

        i = 1000000;

        void tekeeJotain(){
        x = i;
        }
        void eiTeeMitaan(){
        p = &i;
        }

        Tuossa ensimmäisessä kopioidaan dataa kun taas jälkimmäisessä kopioidaan vain datan osoite, josta ei ole mitään apua mihinkään. Mitä minä sillä tiedolla osoitteesta nyt teen? Jos haluan muuttaa i arvoa, sen tekisin esim

        i = uusi arvo;
        tai
        i = arvon lisäys;

        Esim kopiointi
        x = i;
        ei olisi mahdollista jollei ohjelma tietäisi missä osoitteessa i on. Jos haluan lukea i arvon, ei tietoa osoitteesta tarvita siihenkään. Ehtolauseet ja tulostukset onnistuu ilman sitä tietoa, eli kopiointia ei tarvita arvon lukemiseen. Missä tilanteessa siitä siis on hyötyä että kopioidaan vain osoite? Jos haluan kirjoittaa tai lukea struct muuttujaan:

        struct.muuttuja = arvo;
        printf("%d", struct.muuttuja);

        Tuohon reaalimaailman esimerkkiin rinnastettuna, miksi haluaisin tietää postilokeron numeron jollen aio sitä johonkin tarkoitukseen käyttää? Postilokeron numeron kopiointi ei siirrä postilokeron sisältöä mihinkään, enkä sen perusteella tiedä edes mitä lokerossa on.
        Vastaavasti, meidän ei tarvitse tietää missä osoitteessa joku paikka on jos olemme siellä aiemmin käyneet, löydämme sinne ilman tietoa osoitteesta. Siksi tämä pointer juttu on niin hämmentävä, koska se vaikuttaa ihan turhalta ominaisuudelta. Silti niitä näkee koodissa jatkuvasti.


      • outo-juttu kirjoitti:

        Ymmärsin kyllä mikä pointer on. En vain keksi millaisessa tilanteessa siitä olisi hyötyä. Esimerkkikoodi

        int x, i;
        int *p;

        i = 1000000;

        void tekeeJotain(){
        x = i;
        }
        void eiTeeMitaan(){
        p = &i;
        }

        Tuossa ensimmäisessä kopioidaan dataa kun taas jälkimmäisessä kopioidaan vain datan osoite, josta ei ole mitään apua mihinkään. Mitä minä sillä tiedolla osoitteesta nyt teen? Jos haluan muuttaa i arvoa, sen tekisin esim

        i = uusi arvo;
        tai
        i = arvon lisäys;

        Esim kopiointi
        x = i;
        ei olisi mahdollista jollei ohjelma tietäisi missä osoitteessa i on. Jos haluan lukea i arvon, ei tietoa osoitteesta tarvita siihenkään. Ehtolauseet ja tulostukset onnistuu ilman sitä tietoa, eli kopiointia ei tarvita arvon lukemiseen. Missä tilanteessa siitä siis on hyötyä että kopioidaan vain osoite? Jos haluan kirjoittaa tai lukea struct muuttujaan:

        struct.muuttuja = arvo;
        printf("%d", struct.muuttuja);

        Tuohon reaalimaailman esimerkkiin rinnastettuna, miksi haluaisin tietää postilokeron numeron jollen aio sitä johonkin tarkoitukseen käyttää? Postilokeron numeron kopiointi ei siirrä postilokeron sisältöä mihinkään, enkä sen perusteella tiedä edes mitä lokerossa on.
        Vastaavasti, meidän ei tarvitse tietää missä osoitteessa joku paikka on jos olemme siellä aiemmin käyneet, löydämme sinne ilman tietoa osoitteesta. Siksi tämä pointer juttu on niin hämmentävä, koska se vaikuttaa ihan turhalta ominaisuudelta. Silti niitä näkee koodissa jatkuvasti.

        "Ymmärsin kyllä mikä pointer on. En vain keksi millaisessa tilanteessa siitä olisi hyötyä. Esimerkkikoodi"

        Esimerkkikoodissasi ei ole järkeä käyttää osoitinta.

        Se on tarpeellista siinä kohtaa kun on vaikka gigatavun verran dataa jota käsittelee se funktio. Kokeile kirjoittaa koodi siihen niin huomaat.

        "Missä tilanteessa siitä siis on hyötyä että kopioidaan vain osoite?"

        Tee koodinpätkä missä laitat funktiolle gigan, tai vaikka 5 gigaa tavaraa jonka se funktio käsittelee. Ei tietenkään mitään yksittäisiä muuttujia osoittimina välitetä turhanpäiten.

        "Tuohon reaalimaailman esimerkkiin rinnastettuna, miksi haluaisin tietää postilokeron numeron jollen aio sitä johonkin tarkoitukseen käyttää? Postilokeron numeron kopiointi ei siirrä postilokeron sisältöä mihinkään, enkä sen perusteella tiedä edes mitä lokerossa on."

        Kun on osoitin vaikka viiden gigan kokoiseen rakenteeseen niin kaikki se tieto on käsiteltävissä sen osoittimen kautta, eli siis tiedetään. Kopioidaan vain osoitin tietoon ja koko 5 gigaa on käsiteltävissä.

        "Vastaavasti, meidän ei tarvitse tietää missä osoitteessa joku paikka on jos olemme siellä aiemmin käyneet, löydämme sinne ilman tietoa osoitteesta."

        Näytä miten teet funktion joka käsittelee jossain muualla olevaa 5 gigan tietorakennetta.

        "Siksi tämä pointer juttu on niin hämmentävä, koska se vaikuttaa ihan turhalta ominaisuudelta. Silti niitä näkee koodissa jatkuvasti."

        Varmaankin jos on dynaamisesti varattua muistia niin osoittimia siellä sitten on. Se muistialue mikä varataan pitää olla vaikka 1-5 gigaa ja koko tarpeen mukaan.


      • outo-juttu
        M-Kar kirjoitti:

        "Ymmärsin kyllä mikä pointer on. En vain keksi millaisessa tilanteessa siitä olisi hyötyä. Esimerkkikoodi"

        Esimerkkikoodissasi ei ole järkeä käyttää osoitinta.

        Se on tarpeellista siinä kohtaa kun on vaikka gigatavun verran dataa jota käsittelee se funktio. Kokeile kirjoittaa koodi siihen niin huomaat.

        "Missä tilanteessa siitä siis on hyötyä että kopioidaan vain osoite?"

        Tee koodinpätkä missä laitat funktiolle gigan, tai vaikka 5 gigaa tavaraa jonka se funktio käsittelee. Ei tietenkään mitään yksittäisiä muuttujia osoittimina välitetä turhanpäiten.

        "Tuohon reaalimaailman esimerkkiin rinnastettuna, miksi haluaisin tietää postilokeron numeron jollen aio sitä johonkin tarkoitukseen käyttää? Postilokeron numeron kopiointi ei siirrä postilokeron sisältöä mihinkään, enkä sen perusteella tiedä edes mitä lokerossa on."

        Kun on osoitin vaikka viiden gigan kokoiseen rakenteeseen niin kaikki se tieto on käsiteltävissä sen osoittimen kautta, eli siis tiedetään. Kopioidaan vain osoitin tietoon ja koko 5 gigaa on käsiteltävissä.

        "Vastaavasti, meidän ei tarvitse tietää missä osoitteessa joku paikka on jos olemme siellä aiemmin käyneet, löydämme sinne ilman tietoa osoitteesta."

        Näytä miten teet funktion joka käsittelee jossain muualla olevaa 5 gigan tietorakennetta.

        "Siksi tämä pointer juttu on niin hämmentävä, koska se vaikuttaa ihan turhalta ominaisuudelta. Silti niitä näkee koodissa jatkuvasti."

        Varmaankin jos on dynaamisesti varattua muistia niin osoittimia siellä sitten on. Se muistialue mikä varataan pitää olla vaikka 1-5 gigaa ja koko tarpeen mukaan.

        Se on esimerkkikoodia, mutta näitä toteutuksia näkee jatkuvasti. Jotkut käyttävät pointereita vain siksi kun eivät jaksa kirjoittaa jatkuvasti struct ensimmainen.toinen.kolmas vaan kirjoittavat

        double *ptr = &ensimmainen.toinen.kolmas;
        jonka jälkeen voivat kirjoittaa koodiin vain sen ptr.
        Tuo tekee koodista vain entistä kryptisempää, ei ihmisläheistä.

        Gigatavuun vaaditaan kyllä jotain todella massiivista struct rakennetta. Jos haluat sellaiseen kirjoittaa

        struct giga {
        double todella;
        double paljon;
        double tavaraa;
        }
        void lisaaArvo(){
        giga.tavaraa = 4.20;
        }

        Ei meidän tarvitse tuota varten mitään pointeria tehdä. Kaikkia structin sisällä olevia muuttujia voidaan erikseen kirjoittaa ja lukea, koko paketin voi kopioida tai sitten vain osan. Jos halutaan käsitellä vaikka puolet siitä, sille voi tehdä erillisen structin sinne gigan sisälle tai tehdä erillisen listan esim. arrayn, sen ulkopuolelle. Pointer sisältää vain muistipaikan osoitteen. Sen muistipaikan sisällön käsittelyssä tieto osoitteesta on ihan turha.

        Hyvistä selitys-yrityksistänne huolimatta, kiitos niistä muuten, en edelleenkään keksi mihin muuhun pointeria tarvii kuin vähentämään koodin tekstiä. Se puolestaan tekee koodista vaikeampaa luettavaa eikä muuta. Mielestäni kaikki esimerkit joita olen tähän asti kuullut ja nähnyt, joissa käytetään pointereita, voi ja varmaan kannattaisi toteuttaa struct, enum tai array avulla.

        Pointer tarvii datatyypin esim
        int *ptr;
        joka puolestaan tarkoittaa ettei siinä edes ole mitään dynaamista. Staattinen muistialue saadaan malloc avulla, dynaaminen esimerkiksi array avulla. Samat keinot toimii datan koosta riippumatta. C kielessä array on tietääkseni ainoa keino tallentaa merkkijono, jonka pituutta ei vielä tiedetä. Array on siis dynaaminen muistialue joka ottaa arvoikseen ennalta määrätyn datatyypin esim char. Ihan hyvin se voi olla myös double ja ihan hyvin voi käsitellä gigan tavaraa.

        Se mitä yritätte nyt sanoa, tarkoittaisi että pointer olisi ikään kuin array. Se tarkoittaisi että voisimme käsitellä merkkijonoa yhden pointerin avulla. Siitä haluaisin nähdä toimivan mutta järkevän esimerkin. Puhun nyt koodista esim

        char *String;
        char merkkijono[] = "merkkejä";
        String = &merkkijono[];

        kirjoittakaa tuolle nyt jokin hyödyllinen esimerkki, esim

        String = "meikkejä";

        koska tiedämmehän jo ettei tuo toimi tuolla tavalla? Tuo on esimerkki joka käsittelee todella pientä dataa, mutta sama sääntö pätee gigan datassa. Tietääkseni ainoa keino käsitellä array tyyppistä dataa, jos esimerkiksi halutaan vaihtaa yksi merkki,
        merkkijono[2] = 'i';

        Millähän tavalla pointer tekee tuon tehokkaammin ja yksinkertaisemmin? Jos pointer on keino tehdä jonkin datan, olkoon vaikka giga, käsittelystä tehokkaampaa, miksi se ei olisi sitä myös pienen datan kanssa? Kiitosta vaan että yritätte vastailla.


      • outo-juttu
        M-Kar kirjoitti:

        "Ymmärsin kyllä mikä pointer on. En vain keksi millaisessa tilanteessa siitä olisi hyötyä. Esimerkkikoodi"

        Esimerkkikoodissasi ei ole järkeä käyttää osoitinta.

        Se on tarpeellista siinä kohtaa kun on vaikka gigatavun verran dataa jota käsittelee se funktio. Kokeile kirjoittaa koodi siihen niin huomaat.

        "Missä tilanteessa siitä siis on hyötyä että kopioidaan vain osoite?"

        Tee koodinpätkä missä laitat funktiolle gigan, tai vaikka 5 gigaa tavaraa jonka se funktio käsittelee. Ei tietenkään mitään yksittäisiä muuttujia osoittimina välitetä turhanpäiten.

        "Tuohon reaalimaailman esimerkkiin rinnastettuna, miksi haluaisin tietää postilokeron numeron jollen aio sitä johonkin tarkoitukseen käyttää? Postilokeron numeron kopiointi ei siirrä postilokeron sisältöä mihinkään, enkä sen perusteella tiedä edes mitä lokerossa on."

        Kun on osoitin vaikka viiden gigan kokoiseen rakenteeseen niin kaikki se tieto on käsiteltävissä sen osoittimen kautta, eli siis tiedetään. Kopioidaan vain osoitin tietoon ja koko 5 gigaa on käsiteltävissä.

        "Vastaavasti, meidän ei tarvitse tietää missä osoitteessa joku paikka on jos olemme siellä aiemmin käyneet, löydämme sinne ilman tietoa osoitteesta."

        Näytä miten teet funktion joka käsittelee jossain muualla olevaa 5 gigan tietorakennetta.

        "Siksi tämä pointer juttu on niin hämmentävä, koska se vaikuttaa ihan turhalta ominaisuudelta. Silti niitä näkee koodissa jatkuvasti."

        Varmaankin jos on dynaamisesti varattua muistia niin osoittimia siellä sitten on. Se muistialue mikä varataan pitää olla vaikka 1-5 gigaa ja koko tarpeen mukaan.

        "Kopioidaan vain osoitin tietoon ja koko 5 gigaa on käsiteltävissä."

        ^^tämä^^

        Tämä selkeytti asiaa. Mielestäni se kuitenkaan ole käsiteltävissä, mutta sisältö voidaan linkittää dynaamisesti. Eli siis jos halutaan sisällyttää jokin rakenne, varsinkin iso, dynaamisena johonkin toiseen rakenteeseen vaikkapa structiin, niin silloin olisi järkevä käyttää pointeria.

        Tämä on todella selkeästi ymmärrettävissä jos verrataan tiedostojärjestelmässä olevaan isoon hakemistoon esim. /usr/bin mutta ei haluta varsinaisesti kopioida sitä esimerkiksi /home/käyttäjä hakemistoon. Teemme vain symbolisen linkin eli "pikakuvakkeen" hakemistoon /home/käyttäjä.

        Uskokaa tai älkää mutta netistä on vaikea löytää näin hyvää selitystä edes Englanniksi. Löytyyköhän edes C kielen raamatusta, pitää lukea se uudestaan.


      • outo-juttu
        outo-juttu kirjoitti:

        "Kopioidaan vain osoitin tietoon ja koko 5 gigaa on käsiteltävissä."

        ^^tämä^^

        Tämä selkeytti asiaa. Mielestäni se kuitenkaan ole käsiteltävissä, mutta sisältö voidaan linkittää dynaamisesti. Eli siis jos halutaan sisällyttää jokin rakenne, varsinkin iso, dynaamisena johonkin toiseen rakenteeseen vaikkapa structiin, niin silloin olisi järkevä käyttää pointeria.

        Tämä on todella selkeästi ymmärrettävissä jos verrataan tiedostojärjestelmässä olevaan isoon hakemistoon esim. /usr/bin mutta ei haluta varsinaisesti kopioida sitä esimerkiksi /home/käyttäjä hakemistoon. Teemme vain symbolisen linkin eli "pikakuvakkeen" hakemistoon /home/käyttäjä.

        Uskokaa tai älkää mutta netistä on vaikea löytää näin hyvää selitystä edes Englanniksi. Löytyyköhän edes C kielen raamatusta, pitää lukea se uudestaan.

        Ei mutta silti, missä tilanteessa tuostakaan olisi hyötyä? Tämä on nyt oikeasti todella vaikea asia käsittää. Pointer eli linkki voidaan siis sisällyttää johonkin rakenteeseen dynaamisena, mutta eihän funktio itsessään edes sisällä mitään dataa vaan ainoastaan kutsuu sitä. Data sijaitsee muuttujissa, external silloin kun ne on esitelty funktioiden ulkopuolella, local silloin kun funktiossa.

        Eli siis dynaamista muistialuetta voi käsitellä funktiossa, se ei kopioidu sinne funktioon. Jos haluat sisällyttää gigan verran struct dataa johonkin pienempään struct dataan, voit tehdä sille erillisen funktion joka sisällyttää sen vain kutsuttaessa.

        Edelliseen esimerkkiini lisäten, jos luot symbolisen linkin eli "pikakuvakkeen" omaan kotihakemistoosi joka linkittää vaikka sen /usr/bin hakemiston, mikä sen varsinainen hyöty on? Jos ajatellaan että funktio() on skripti, joka listaa kaikki tiedostot hakemistosta /usr/bin aina kun tuota skriptiä kutsutaan

        ls /usr/bin

        se tekee tismalleen saman asian kuin

        ls bin

        jossa bin on symbolinen linkki.

        Pointer ei siis varsinaisesti lisää mitään toiminnallisuutta vaan tekee saman asian toisella tavalla? Kun kokeillaan tätä kääntämällä C koodi assemblyksi

        cc -S testi.c

        Syntyvä asm koodi ei välttämättä ole yhtään erilainen käytettiinpä funktiota tai pointeria. En nyt yhtään tiedä onko pointerista edelleenkään mitään konkreettista hyötyä. Funktion avulla voi tehdä saman asian mutta etuna se että sitä ei tarvitse sisällyttää mihinkään rakenteeseen joka puolestaan tarkoittaa että koodin pätkä struct voidaan kopioida vaikka toiseen ohjelmaan sellaisenaan, ilman että sinne jää jäänteitä pointerista jolla voi olla vaikka sama nimi kuin uuden ohjelman ihan eri linkillä. Silloinhan kääntäjä ei edes anna varoitusta ja soppa on valmis.


      • outo-juttu kirjoitti:

        Se on esimerkkikoodia, mutta näitä toteutuksia näkee jatkuvasti. Jotkut käyttävät pointereita vain siksi kun eivät jaksa kirjoittaa jatkuvasti struct ensimmainen.toinen.kolmas vaan kirjoittavat

        double *ptr = &ensimmainen.toinen.kolmas;
        jonka jälkeen voivat kirjoittaa koodiin vain sen ptr.
        Tuo tekee koodista vain entistä kryptisempää, ei ihmisläheistä.

        Gigatavuun vaaditaan kyllä jotain todella massiivista struct rakennetta. Jos haluat sellaiseen kirjoittaa

        struct giga {
        double todella;
        double paljon;
        double tavaraa;
        }
        void lisaaArvo(){
        giga.tavaraa = 4.20;
        }

        Ei meidän tarvitse tuota varten mitään pointeria tehdä. Kaikkia structin sisällä olevia muuttujia voidaan erikseen kirjoittaa ja lukea, koko paketin voi kopioida tai sitten vain osan. Jos halutaan käsitellä vaikka puolet siitä, sille voi tehdä erillisen structin sinne gigan sisälle tai tehdä erillisen listan esim. arrayn, sen ulkopuolelle. Pointer sisältää vain muistipaikan osoitteen. Sen muistipaikan sisällön käsittelyssä tieto osoitteesta on ihan turha.

        Hyvistä selitys-yrityksistänne huolimatta, kiitos niistä muuten, en edelleenkään keksi mihin muuhun pointeria tarvii kuin vähentämään koodin tekstiä. Se puolestaan tekee koodista vaikeampaa luettavaa eikä muuta. Mielestäni kaikki esimerkit joita olen tähän asti kuullut ja nähnyt, joissa käytetään pointereita, voi ja varmaan kannattaisi toteuttaa struct, enum tai array avulla.

        Pointer tarvii datatyypin esim
        int *ptr;
        joka puolestaan tarkoittaa ettei siinä edes ole mitään dynaamista. Staattinen muistialue saadaan malloc avulla, dynaaminen esimerkiksi array avulla. Samat keinot toimii datan koosta riippumatta. C kielessä array on tietääkseni ainoa keino tallentaa merkkijono, jonka pituutta ei vielä tiedetä. Array on siis dynaaminen muistialue joka ottaa arvoikseen ennalta määrätyn datatyypin esim char. Ihan hyvin se voi olla myös double ja ihan hyvin voi käsitellä gigan tavaraa.

        Se mitä yritätte nyt sanoa, tarkoittaisi että pointer olisi ikään kuin array. Se tarkoittaisi että voisimme käsitellä merkkijonoa yhden pointerin avulla. Siitä haluaisin nähdä toimivan mutta järkevän esimerkin. Puhun nyt koodista esim

        char *String;
        char merkkijono[] = "merkkejä";
        String = &merkkijono[];

        kirjoittakaa tuolle nyt jokin hyödyllinen esimerkki, esim

        String = "meikkejä";

        koska tiedämmehän jo ettei tuo toimi tuolla tavalla? Tuo on esimerkki joka käsittelee todella pientä dataa, mutta sama sääntö pätee gigan datassa. Tietääkseni ainoa keino käsitellä array tyyppistä dataa, jos esimerkiksi halutaan vaihtaa yksi merkki,
        merkkijono[2] = 'i';

        Millähän tavalla pointer tekee tuon tehokkaammin ja yksinkertaisemmin? Jos pointer on keino tehdä jonkin datan, olkoon vaikka giga, käsittelystä tehokkaampaa, miksi se ei olisi sitä myös pienen datan kanssa? Kiitosta vaan että yritätte vastailla.

        Ei tietenkään ole mitään structin rakennetta kun se rakenne voi olla dynaaminen. Ei tiedetä onko siinä 1000 vai miljardi osaa ja onko se minkälainen puu tai graafi.

        Et ole esittänyt rakennetta missä olisi 5 gigan verran tavaraa. Oli vain 3kpl doublea. Laita niitä doubleja miljardi, eli miljardi riviä koodia jos käsin haluat välttämättä rakentaa.

        Sen lisäksi unodat myös sen, että isoja tietomääriä ei voida vaan kopioida funktioissa koska funktiokutsut menevät pinomuistissa jota rajallinen määrä.

        Dynaaminen muistinvaraus ja se, että isoja määriä dataa ei voida kopioida funktioiden argumentteina pakottaa käyttämään osoittimia C-kielessä. Tietysti sitä vältetään mutta käytännön ohjelmissa ei voida täysin välttyä käyttämästä osoittimia kun käyttää C-kieltä.


      • outo-juttu
        M-Kar kirjoitti:

        Ei tietenkään ole mitään structin rakennetta kun se rakenne voi olla dynaaminen. Ei tiedetä onko siinä 1000 vai miljardi osaa ja onko se minkälainen puu tai graafi.

        Et ole esittänyt rakennetta missä olisi 5 gigan verran tavaraa. Oli vain 3kpl doublea. Laita niitä doubleja miljardi, eli miljardi riviä koodia jos käsin haluat välttämättä rakentaa.

        Sen lisäksi unodat myös sen, että isoja tietomääriä ei voida vaan kopioida funktioissa koska funktiokutsut menevät pinomuistissa jota rajallinen määrä.

        Dynaaminen muistinvaraus ja se, että isoja määriä dataa ei voida kopioida funktioiden argumentteina pakottaa käyttämään osoittimia C-kielessä. Tietysti sitä vältetään mutta käytännön ohjelmissa ei voida täysin välttyä käyttämästä osoittimia kun käyttää C-kieltä.

        "Tietysti sitä vältetään mutta käytännön ohjelmissa ei voida täysin välttyä käyttämästä osoittimia kun käyttää C-kieltä."

        Mitä tämäkin tarkoittanee? C kieli on todella lähellä konetta. Ymmärsin muualla että pointerit on tärkeitä mutta myös olennainen osa C kieltä. OOP pellet puhuu jostain käytännön ohjelmista samalla kun tietävät että suurin osa UNIX ohjelmista tehtiin C kielellä. Koko UNIX tehtiin C kielellä. Pointer on siis se käsite, eli osoita mihin haluat. Missä on mun sukat? Tietäjän sormi osoittaa ->

        "Sen lisäksi unodat myös sen, että isoja tietomääriä ei voida vaan kopioida funktioissa koska funktiokutsut menevät pinomuistissa jota rajallinen määrä."

        Tämä ei pidä paikkaansa. Tämä ei ole kielestä kiinni edes. Puhut nyt prosessorista, muistin määrästä, kiintolevyn koosta.

        Pointer on siis vaikea asia. C kieli on tuomittu sen takia.

        C kieli on minusta arvostettu todella alas. Siinä on makrot ja kaikki.
        #define KUSIPÄÄ null

        P.S. Vihaan Javaa


      • outo-juttu
        M-Kar kirjoitti:

        Ei tietenkään ole mitään structin rakennetta kun se rakenne voi olla dynaaminen. Ei tiedetä onko siinä 1000 vai miljardi osaa ja onko se minkälainen puu tai graafi.

        Et ole esittänyt rakennetta missä olisi 5 gigan verran tavaraa. Oli vain 3kpl doublea. Laita niitä doubleja miljardi, eli miljardi riviä koodia jos käsin haluat välttämättä rakentaa.

        Sen lisäksi unodat myös sen, että isoja tietomääriä ei voida vaan kopioida funktioissa koska funktiokutsut menevät pinomuistissa jota rajallinen määrä.

        Dynaaminen muistinvaraus ja se, että isoja määriä dataa ei voida kopioida funktioiden argumentteina pakottaa käyttämään osoittimia C-kielessä. Tietysti sitä vältetään mutta käytännön ohjelmissa ei voida täysin välttyä käyttämästä osoittimia kun käyttää C-kieltä.

        "Ei tietenkään ole mitään structin rakennetta kun se rakenne voi olla dynaaminen"

        Tuo on on muuten määriteltävissä. Kun tuon opit niin olet sitten ns Hacker ;)


      • outo-juttu kirjoitti:

        "Ei tietenkään ole mitään structin rakennetta kun se rakenne voi olla dynaaminen"

        Tuo on on muuten määriteltävissä. Kun tuon opit niin olet sitten ns Hacker ;)

        "Mitä tämäkin tarkoittanee? C kieli on todella lähellä konetta."

        Niin?

        "Tämä ei pidä paikkaansa. Tämä ei ole kielestä kiinni edes. Puhut nyt prosessorista, muistin määrästä, kiintolevyn koosta."

        En vaan puhun pinosta. Sitä kun C:llä käsittelee jotain puu rakennetta rekursiivisesti vaikka ja sitten jos on puu vähän epätasapainossa ja rekursio syvenee niin voikin tulla pinon ylivuoto.

        C, ja myös C ohjelmoija joutuu huomioimaan tämän ja johtuu nimenomaan kielestä. C ja C ovat rajoitteisia kun on käytetään rekursiota tai välitetään tietorakenteita funktioihin ilman osoittimia.

        "Pointer on siis vaikea asia. C kieli on tuomittu sen takia."

        Ei siinä mitään vaikeata ole. Se vaan tkee koodin lukemisen helposti huonommaksi joten sitä vältetään.

        "Tuo on on muuten määriteltävissä. Kun tuon opit niin olet sitten ns Hacker ;)"

        Dynaaminen muistinvaraus ja erilaiset tietorakenteet kuten puu, graafi, linkitetty lista jne. ovat perusteita.


    • pointteri

      Tietokoneen muistissa olevilla asioilla on kaksi ominaisuutta: osoite, eli paikka jossa asia sijaitsee ja sisältö, eli tallennettu arvo. C on matalan tason kieli, joten siinä nämä ominaisuudet ovat suoraan ohjelmoijan nähtävissä ja käytettävissä, pointteri ja muuttujan arvo. C:ssä toimitaan tavallaan lähempänä koneen sisäistä toimintaa kuin korkeamman tason kielissä, joissa pointterit voivat olla ohjelmoijalta piilotettuna, vaikkakin lopullinen ajettava koodi toki käyttää niitä.

      C on myös hyvin yksinkertainen kieli, jossa ei ole suoraan tuettuna kovin monipuolisia tietorakenteita, esim. stringejä tai listoja, ja niiden toteuttamisessa tulee usein vastaan tarve myös pointterien käyttöön. Esimerkiksi linkitetyn listan jokaiseen itemiin tarvitaan vähintäänkin pointteri seuraavaan itemiin, jne.

      C:ssä pointtereita käytetään yleisesti esim. seuraaviin tarkoituksiin:

      - Jo edelläkin mainittu tiedon välittäminen toiseen ohjelman osaan, esim. funktiokutsussa. Pointterin käyttö vähentää muistin kulutusta ja prosessorin kuormitusta, eli ohjelma toimii nopeammin ja/tai vähemmillä resursseilla.

      - Pointterin avulla kutsuttava funktio voi myös muuttaa annetun muuttujan/datarakenteen sisältöä. Tämä voi olla hyödyllistä esim. monimutkaista datarakennetta käsiteltäessä. Kaikkea ei tarvitse kirjoittaa yhteen pötköön, vaan käsittelyä voidaan jakaa pienempiin osiin, funktioihin. Tämä selkeyttää ohjelman rakennetta, helpottaa ylläpitoa jne. Toisaalta samalle tiedolle voi olla erilaisia tapoja käsitellä, hakutoimintoja, vertailua, erilaisia muunnoksia, jotka on järkevää toteuttaa erillisissä funktioissa.

      - Edellisissä kohdissa mainittuja asioita käytetään käytännössä esimerkiksi merkkijonojen käsittelyssä C:n standardikirjaston funktioilla. Sinne annetaan aina käsiteltävän merkkijonon (tai merkkijonojen) osoite, ei kopiota merkkijonosta. Vaikka osa funktioista toimisikin myös kopiolla, niin ohjelman tehokkuuden kannalta on silti parempi käyttää pointteria.

      - Dynaaminen muistin varaus/vapautus toimii pointterien avulla. Muistia varatessa saadaan osoite muistialueen alkuun. Sen kautta muistia voidaan käyttää. Pointteri on se tapa, jolla kerrotaan, että jokin asia on juuri sen varatun muistialueen sisällä, eikä jossain muualla.

      - Monimutkaisen tietorakenteen käsittelyssä voi olla hyödyllistä käyttää pointteria käsiteltävään osaan. Se voi hyvin tehtynä myös selkeyttää lähdekoodia, eikä välttämättä tee sitä kryptisemmäksi. Lisäksi sillä voidaan saavuttaa myös suorituskykyhyötyä, jos tilanne on sellainen, ettei kääntäjä onnistu optimoimaan koodia hyvin niin, että kyseistä tietorakenteen osaa ei jouduta jokaisella käyttökerralla hakemaan alusta asti selaamalla rakenteen läpi.

      - Laiteläheisessä ohjelmoinnissa käytetään pointtereita erilaisten hw-blokkien ja prosessoriin liitettyjen I/O laitteiden ohjaamiseen. Esim. sulautetussa ohjelmistossa on yleistä, että erilaisten laitteiden rekistereitä ohjataan ja luetaan jonkin tietyn kantaosoitteen ja offsettien avulla. Ne määräytyvät sen mukaan, miten laitteet on rautatasolla kytketty.

      Kai sitä on muutakin käyttöä, mutta tässä nyt ensimmäisenä mieleen tulleet asiat.

      • C vähän kaipaa sellaisia ohjelmointikäytäntöjä jossa käsitellään jotain datapalasta immutablena jolloin tosiaankin voidaan välittää osoitin siihen.

        Sehän on itseasiassa huonoa ohjelmointitapaa että samaa tietoa muuttelee eri ohjelmien osat miten sattuu.

        Mutta, kannattaa muistaa mihin se C on tehty että sehän on systeemiohjelmointiin ja tarkoitettu korkean tason assembleriksi. Sovellusten tekemiseen on paremmat työkalut.


      • ragre
        M-Kar kirjoitti:

        C vähän kaipaa sellaisia ohjelmointikäytäntöjä jossa käsitellään jotain datapalasta immutablena jolloin tosiaankin voidaan välittää osoitin siihen.

        Sehän on itseasiassa huonoa ohjelmointitapaa että samaa tietoa muuttelee eri ohjelmien osat miten sattuu.

        Mutta, kannattaa muistaa mihin se C on tehty että sehän on systeemiohjelmointiin ja tarkoitettu korkean tason assembleriksi. Sovellusten tekemiseen on paremmat työkalut.

        >>Sovellusten tekemiseen on paremmat työkalut.
        Kuten?


      • ragre kirjoitti:

        >>Sovellusten tekemiseen on paremmat työkalut.
        Kuten?

        Vaikka funktionaaliset kielet tai oliokielet sopivat paremmin sovellusten tekemiseen ja käyttöliittymäpuolella kieli pitäisi oikeastaan olla semmoinen mikä käännetään Javascriptiksi tai on Javascriptiä.


      • pointeritjapointerit

        Tulee vain se räkänokka-tehonpuute prossan tehoista vastaan jos ei riitäkään mihinkään fourier-analyyseihin ja sellaisiin reaaliaikaisiin sitten multicore-prossillakaan.

        Ohjelmakoodin nopeus kuin assemblyä pitäisi olla.

        Niin pointerit ovat todellakin vain muistiosoitteita, pointerit pointereihin, jne... silloin menee hieman monimutkaisemmaksi jos joku pointer osoittaa johonkin grafiikkakiihdyttimen muistiosoitteeseen jossa on suoritettavaa koodia ;)


      • outo-juttuu
        M-Kar kirjoitti:

        C vähän kaipaa sellaisia ohjelmointikäytäntöjä jossa käsitellään jotain datapalasta immutablena jolloin tosiaankin voidaan välittää osoitin siihen.

        Sehän on itseasiassa huonoa ohjelmointitapaa että samaa tietoa muuttelee eri ohjelmien osat miten sattuu.

        Mutta, kannattaa muistaa mihin se C on tehty että sehän on systeemiohjelmointiin ja tarkoitettu korkean tason assembleriksi. Sovellusten tekemiseen on paremmat työkalut.

        "Sehän on itseasiassa huonoa ohjelmointitapaa että samaa tietoa muuttelee eri ohjelmien osat miten sattuu."

        Millä perusteella? Sanoiko joku yliopiston OOP fani näin?


      • OOPmyASS
        pointeritjapointerit kirjoitti:

        Tulee vain se räkänokka-tehonpuute prossan tehoista vastaan jos ei riitäkään mihinkään fourier-analyyseihin ja sellaisiin reaaliaikaisiin sitten multicore-prossillakaan.

        Ohjelmakoodin nopeus kuin assemblyä pitäisi olla.

        Niin pointerit ovat todellakin vain muistiosoitteita, pointerit pointereihin, jne... silloin menee hieman monimutkaisemmaksi jos joku pointer osoittaa johonkin grafiikkakiihdyttimen muistiosoitteeseen jossa on suoritettavaa koodia ;)

        "Ohjelmakoodin nopeus kuin assemblyä pitäisi olla."

        Nyt et selvästikään tiedä mitä kääntäjä tekee. Kaikista kielistä pitäisi tulla teoreettisesti yhtä tehokasta konekieltä.

        Korkeamman tason kielet tarkoittavat vain että kääntäjällä (kone) on entistä vaikeampaa. Konekieli voi olla yhtä hyvää mutta se pitää aina erikseen katsoa jos kääntäjä on eri. Ei voi luottaa. Kun kone hoitaa tämänkin asian, asiat menee pieleen minkä ehtii.

        Esittäkääpä todisteet että OOP on oikeasti tehokkaampaa kuin C.

        Kiitos.


      • outo-juttu
        M-Kar kirjoitti:

        Vaikka funktionaaliset kielet tai oliokielet sopivat paremmin sovellusten tekemiseen ja käyttöliittymäpuolella kieli pitäisi oikeastaan olla semmoinen mikä käännetään Javascriptiksi tai on Javascriptiä.

        "käyttöliittymäpuolella kieli pitäisi oikeastaan olla semmoinen mikä käännetään Javascriptiksi tai on Javascriptiä"

        Ymmärrän täysin. Mutta.

        XML, CSS, HTML, PHP, JavaScript siitä lähtee Java, Node.js ym.

        Kaikki nuo perustuu C kieleen ja C kielellä voisi kaiken tuon myös toteuttaa.

        Itse olen sitä mieltä että C sekä HTML, mahdollisesti XML pitäisi olla se "ydin".

        Näin se itseasiassa onkin. Miten saadaan kaikki tajuamaan asia?


      • outo-juttuu kirjoitti:

        "Sehän on itseasiassa huonoa ohjelmointitapaa että samaa tietoa muuttelee eri ohjelmien osat miten sattuu."

        Millä perusteella? Sanoiko joku yliopiston OOP fani näin?

        Se altistaa bugeille ja estää monia optimointeja ajettaessa koodia rinnakkain.

        Itseasiassa siistissä koodissa pitäisi välttää sijoitusoperaattoriakin mutta C ei tue lazy evaluationia niin sitten esilasketaan juttuja vakioihin ja tulee siinä sitten sijoituslauseita.


      • OOPmyASS kirjoitti:

        "Ohjelmakoodin nopeus kuin assemblyä pitäisi olla."

        Nyt et selvästikään tiedä mitä kääntäjä tekee. Kaikista kielistä pitäisi tulla teoreettisesti yhtä tehokasta konekieltä.

        Korkeamman tason kielet tarkoittavat vain että kääntäjällä (kone) on entistä vaikeampaa. Konekieli voi olla yhtä hyvää mutta se pitää aina erikseen katsoa jos kääntäjä on eri. Ei voi luottaa. Kun kone hoitaa tämänkin asian, asiat menee pieleen minkä ehtii.

        Esittäkääpä todisteet että OOP on oikeasti tehokkaampaa kuin C.

        Kiitos.

        "Nyt et selvästikään tiedä mitä kääntäjä tekee. Kaikista kielistä pitäisi tulla teoreettisesti yhtä tehokasta konekieltä."

        Ei oikeastaan. Kielen toiminta voi vaatia tiettyjen rakenteiden raahaamista mikä tuo overheadia, garbage collection tuo overheadia, muuttuvat rakenteet estävät koneeliset optimoinnit ja jne.

        "Korkeamman tason kielet tarkoittavat vain että kääntäjällä (kone) on entistä vaikeampaa."

        Itseasiassa ei. Kyse on siitä kuinka monimutkainen se kieli on kuinka vaikeata on. Melkoisen paljon ratkaisee kielen toteutus sitten myös.

        Yksi tehokkaimpia kieli mitä löytyy on Haskell, ja sen suorituskyky perustuu siihen että kieli estää kaikennäköiset typeryydet joten laskentaa voidaan rinnakkaistaa. Tuossa kääntäjä taisi käyttää C:tä assemblerina missä C-kääntäjä kääntää konekielelle mutta lopputulos on hyvin optimoitua ja käsin C:llä nysväämällä ei saisi niin siististi tehtyä ja se optimoitu koodi ei välttämättä ole C-kielellä kovin luettavaa.

        Sitähän se on myös että C:llä myös saa herkästi nopeampaa kuin assemblerilla kun C-kääntäjä tuntee ne kaikki optimoinnit ja ihmiselle menee kovin hankalaksi käsin nysvätä suuren mittaluokan optimointia.

        "Esittäkääpä todisteet että OOP on oikeasti tehokkaampaa kuin C."

        OOP lähinnä työkalu millä saadaan scopetukset yms. ilmaistua paremmin. C:llä kun on rajoitteita esim. 32 merkin nimet, eli nimiavaruus käy ahtaaksi ja joidenkin asioiden tekeminen käy sotkuisemmaksi tai jää käännösaikaisia tarkistuksia tekemättä.

        Siellä missä C:tä käytetään ei ole niin väliksi vaikka ne toiminnot puuttuvat kielestä. C:tähän ei käytetä sovellusohjelmointiin.


      • outo-juttu kirjoitti:

        "käyttöliittymäpuolella kieli pitäisi oikeastaan olla semmoinen mikä käännetään Javascriptiksi tai on Javascriptiä"

        Ymmärrän täysin. Mutta.

        XML, CSS, HTML, PHP, JavaScript siitä lähtee Java, Node.js ym.

        Kaikki nuo perustuu C kieleen ja C kielellä voisi kaiken tuon myös toteuttaa.

        Itse olen sitä mieltä että C sekä HTML, mahdollisesti XML pitäisi olla se "ydin".

        Näin se itseasiassa onkin. Miten saadaan kaikki tajuamaan asia?

        "Kaikki nuo perustuu C kieleen ja C kielellä voisi kaiken tuon myös toteuttaa."

        C-kieli on käytännössä assembler mihin käännetään natiivitasolla, siellä POSIX jutuissa.

        Javascript on sama käyttöliittymäpuolella. Se on assembler mihin käännetään niistä kielistä millä ohjelmat tehdään.

        Ideana näissä aika pitkälti standardointi. C-kieli sitten on defacto systeemiohjelmoinnissa mutta miksi sillä nyt pitäisi muuta tehdä?


      • pointeritjapointerit kirjoitti:

        Tulee vain se räkänokka-tehonpuute prossan tehoista vastaan jos ei riitäkään mihinkään fourier-analyyseihin ja sellaisiin reaaliaikaisiin sitten multicore-prossillakaan.

        Ohjelmakoodin nopeus kuin assemblyä pitäisi olla.

        Niin pointerit ovat todellakin vain muistiosoitteita, pointerit pointereihin, jne... silloin menee hieman monimutkaisemmaksi jos joku pointer osoittaa johonkin grafiikkakiihdyttimen muistiosoitteeseen jossa on suoritettavaa koodia ;)

        "Tulee vain se räkänokka-tehonpuute prossan tehoista vastaan jos ei riitäkään mihinkään fourier-analyyseihin ja sellaisiin reaaliaikaisiin sitten multicore-prossillakaan."

        Mitä analyysejä nyt tarvitsee edustalla tehdä...?

        Suorituskyky ei kyllä ole ollut oikeasti mikään ongelma juuri missään varmaan vuosikymmeniin. Tekniikka vain mennyt eteenpäin, että saa asiat tehtyä paremmin.


      • Turbo-Urpo
        M-Kar kirjoitti:

        Se altistaa bugeille ja estää monia optimointeja ajettaessa koodia rinnakkain.

        Itseasiassa siistissä koodissa pitäisi välttää sijoitusoperaattoriakin mutta C ei tue lazy evaluationia niin sitten esilasketaan juttuja vakioihin ja tulee siinä sitten sijoituslauseita.

        Näissä väittämissä ei ole mitään perää, vain upi-tyhmä voi tuollaista kirjoitella. Eikö sinun pitäisi opetella edes perusteen ihan mistä kielestä vaan haluat, tämmöiset väittämät on niin syvältä perseestä ja lisäksi tättä puppua.

        Kansankielellä sanottuna M-Kar sanoo
        Hyvä leipä on sellainen jossa ei ole kuoria.
        SULAA HULLUUTTA TUOLLAINEN MUTUILU


      • Turbo-Urpo kirjoitti:

        Näissä väittämissä ei ole mitään perää, vain upi-tyhmä voi tuollaista kirjoitella. Eikö sinun pitäisi opetella edes perusteen ihan mistä kielestä vaan haluat, tämmöiset väittämät on niin syvältä perseestä ja lisäksi tättä puppua.

        Kansankielellä sanottuna M-Kar sanoo
        Hyvä leipä on sellainen jossa ei ole kuoria.
        SULAA HULLUUTTA TUOLLAINEN MUTUILU

        "Näissä väittämissä ei ole mitään perää, vain upi-tyhmä voi tuollaista kirjoitella. Eikö sinun pitäisi opetella edes perusteen ihan mistä kielestä vaan haluat, tämmöiset väittämät on niin syvältä perseestä ja lisäksi tättä puppua."

        Ei vaan faktaa.

        Jos jokin muistialue on immutable niin se on silloin myös turvallinen säikeistää, tietysti. Ja jos käytetään sijoitusoperaattoria niin hyvin herkästi ollaan tekemässä johonkin sivuvaikutusta tai kytkentöjä. Sekin on kytkentä jos tehdään koodia jonka osien järjestyksellä on väliä, mutta tuota nyt ei tietenkään voi täysin välttää.

        Näyttäisi sinulla olevan perusteissa aika vakavia aukkoja jos et näitä tiedä.


      • Turbo-Urpo
        M-Kar kirjoitti:

        "Näissä väittämissä ei ole mitään perää, vain upi-tyhmä voi tuollaista kirjoitella. Eikö sinun pitäisi opetella edes perusteen ihan mistä kielestä vaan haluat, tämmöiset väittämät on niin syvältä perseestä ja lisäksi tättä puppua."

        Ei vaan faktaa.

        Jos jokin muistialue on immutable niin se on silloin myös turvallinen säikeistää, tietysti. Ja jos käytetään sijoitusoperaattoria niin hyvin herkästi ollaan tekemässä johonkin sivuvaikutusta tai kytkentöjä. Sekin on kytkentä jos tehdään koodia jonka osien järjestyksellä on väliä, mutta tuota nyt ei tietenkään voi täysin välttää.

        Näyttäisi sinulla olevan perusteissa aika vakavia aukkoja jos et näitä tiedä.

        Minä tiedän, ja huomaan pirun hyvin jos joku toinenkin tietää, tunnistan myös täydellisen torvelon perättömät väittämät, valehtelut ja asioiden vääristelyt.


      • Turbo-Urpo kirjoitti:

        Minä tiedän, ja huomaan pirun hyvin jos joku toinenkin tietää, tunnistan myös täydellisen torvelon perättömät väittämät, valehtelut ja asioiden vääristelyt.

        Eli siis väität, että jos joku muistialue on mutable niin se niinkuin auttaisi säikestyksessä tai olisi vaikka jotenkin helpompi verifioida virheettömäksi tai...?


    • Turbo-Urpo

      Taas on huru-ukkon hepatiiti-piiki ja iTikka menneet sekasin, päätellen tämän entuudestaan tunnetun kosmetologin kirjoituksista, mutta meillähän ei syrjitä poliittisen vakaumuksen perusteela, vai miten se oli ?

    • Se_on_osoitin

      Pointeri on osoitin. Esim. kun varaat muistia saat vastaukseksi osoittimen, eli osoitteen muistin paikaan josta varattu muistialue alkaa. Jos haluat tämän osoitteen tallentaa johonkin niin sitten tarvitset muuttujan mihin sen voi tallentaa.

    • Pointterreilla voi toteuttaa erilaisia tietorakenteita kuten linkitettyjä listoja. Nämä tehdään tietueilla, joissa on mukana yksi tai useampi linkki vastaavan tietueeseen. Tai ajattele taulukkoa, johon sijoitetaan mielivaltaisen pitkiä merkkijonoja. Tällöin voidaan tallentaa vain pointterit ja allokoida tila merkkijoille muualta.

    • Ehkä aloittajalle liian vaikeaa mutta koettapas tehdä esim. linkitetty lista ilman pointtereita.

      • nodet

      • nodet

      • nodet kirjoitti:

        Tässä vähän paremmin esitettynä se node-systeemi. http://wiki.amigaos.net/wiki/Exec_Lists_and_Queues

        Hyvin havainnollistettu. Ei onnistu ilman poinntereita ei. Keskustelun perusteella aloittelijalla ei taida olla riittävää kokemusta/tietoa monimutkaisimmista rakenteista. Muistan hyvin kun itsekin ihmettelin esim. OOP:in ideaa ekalla oliohjelmoinnin kurssilla :)


      • iujiuj

        Linkitetyn taulukon voi tehdä myös ihan tavallisella vakiokokoisella taulukolla. Tällöin tosin menetetään dynaamisuus.


      • iujiuj kirjoitti:

        Linkitetyn taulukon voi tehdä myös ihan tavallisella vakiokokoisella taulukolla. Tällöin tosin menetetään dynaamisuus.

        Joo tietenkin voi. Mutta silloin heitetään koko linkitetyn listan idea tavallaan romukoppaan. Tai yleensäkin dynaamisten tietorakenteiden idea.
        Ei kuulosta kauheen kivalta jos ohjelma ilmoittaa tietyn ajan jälkeen että joo, nyt on lista täynnä ja ohjelma suljetaan :) Tai vielä pahempi, kaatuu "access violation" virheeseen...


      • callmemaybe

        Tuollainenkin funtio on olemassa, on oikeastaankin ikivanha c-funktio memmap = map physical memory tuo linear memory.

        Silloin tulevat kysymykseen muistin sivutukset sun muut erikoiset, sekä muistien väliset siirrot DMA;n välityksellä, mutta helppoa.

        Eli saat kyllä c-pointerin johonkin grafiikkaprosessorin toimintoon, melkohelpostikin, jos osaat.


    • Jos luetaan vaikka tiedosto, jossa on tietueita muistiin on dynaaminen lista kätetävä. Yksi muuttuja osoittaa listan alkuun ja toinen loppuun. Loppuun varataan tila tietueelle ja sitten se luetaan levyltä osoittimen osoittamaan paikkaan. Tietueeseen tallennetaan mahdollisesti myös edellisen ja seuraavan tietueen paikka muistissa. Tietueet voidaan lukea myös "puuhun", järjestää tietyn kentän mukaan.

      Osoittimen sisältö voi olla myös vaikka tekstinkäsittelyohjelman tekstin sisältö. Valokuvan pakattu data. Osoittimet tekevät koodin ymmärtämisestä hankalaa. Jos yrittää ymmärtää miten se gif-kuva puretaan C:llä tai koettaa siirtää sitä koodia toiselle kielelle huomaa kuinka paljon siinä on osoittimia.

    • 102030405060

      Pointtereita käytetään monestakin syystä.

      Yksi syy käyttää pointteria voisi olla esim. kun halutaan välittää iso tietorakenne jollekkin funktiolle, ilman, että sitä joudutaan kopioimaan koko rakenne paikasta toiseen. Tällöin riittää, että kopioidaan funktiolle parametrina tietorakenteen "osoite", eli pointteri.

      Toinen käyttökohde on sitten, kun halutaan varata muistia dynaamisesti.

      Kolmas ihan hyödyllinen käyttö on se, että pointtereilla voi laskea, eli voit liikuttaa pointteria tietorakenteessa näppärästi perus laskutoimituksilla.

      Lisäksi niille saattaa olla käyttöä matalan tason ohjelmoinnissa, missä rauta on usein muistiosoitettua.

      Pointteri on siis tehokas työkalu, mutta kuten tehokkaat työkalut yleensä, on pointtereissa myös joitakin vaaranpaikkoja, joiden kanssa lienee syytä olla tarkkana.

    • ihmellinenCasia

      Tuli kyllä aika hyvä peruslausunto pointereista ja fyysisistä sekä lineaarisista muistiosoitteista, kun kysyjä jaksaa vain lukea koko "luennon", niin jotain ymmärtää ehkä.

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

    Luetuimmat keskustelut

    1. Et olisi piilossa enää

      Vaan tulisit esiin.
      Ikävä
      83
      3845
    2. Loukkaantunut lapsi on yhä kriittisessä tilassa

      Seinäjoella Pohjan valtatiellä perjantaina sattuneessa liikenneonnettomuudessa loukkaantunut lapsi on yhä kriittisessä t
      Kauhava
      32
      2719
    3. Minä en ala kenenkään perässä juoksemaan

      Voin jopa rakastaa sinua ja kääntää silti tunteeni pois. Tunteetkin hälvenevät aikanaan, poissa silmistä poissa mielestä
      Ikävä
      95
      2174
    4. Tiedän, että emme yritä mitään

      Jos kohtaamme joskus ja tilaisuus on sopiva, voimme jutella jne. Mutta kumpikaan ei aio tehdä muuta konkreettista asian
      Ikävä
      20
      1687
    5. Onko jollakin navetassa kuolleita eläimiä

      Onko totta mitä facebookissa kirjoitetaan että jonkun navetassa olisi kuolleita eläimiä? Mitä on tapahtunut?
      Puolanka
      26
      1568
    6. Mitä, kuka, hä .....

      Mikähän sota keskustassa on kun poliiseja on liikkeellä kuin vilkkilässä kissoja
      Kemi
      26
      1498
    7. Miten hetki

      Kahden olisi paras
      Ikävä
      28
      1471
    8. Näin pitkästä aikaa unta sinusta

      Oltiin yllättäen jossain julkisessa saunassa ja istuttiin vierekkäin, siellä oli muitakin. Pahoittelin jotain itsessäni
      Ikävä
      7
      1454
    9. Noh joko sä nainen oot lopettanut sen

      miehen kaipailun jota sulla EI ole lupa kaivata. Ja teistä ei koskaan tule mitään. ÄLÄ KOSKAAN SYÖ KUORMASTA JNE! Tutu
      Ikävä
      73
      1433
    10. Hymysi saa tunteet

      Pintaan❤️ jos et tarkoita niin älä tee sitä
      Ikävä
      25
      1387
    Aihe