Asteriksin (*) käyttö osoittimien kanssa

nyyppä____

Olen tässä päässyt alkuun ohjelmointiharrastuksen kanssa. C-kieleen olen tutustunut. Mutta mitä eroa on näillä vai onko mitään:

int *x;
int * x;
int* x;

Kokeilin noita pienellä ohjelmalla enkä huomannut mitään eroa toiminnassa. Eli tarkoittavatko nuo kaikki pointterin määrittelyä ja onko niillä käytön suhteen mitään eroa?

9

547

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • samaa

      int pointeri x:ään.

      välilyönnit ei lasketa, hyvä ohjelmointitapa on int *x;

      • nyyppä_____

        Ok, kiitti selvennyksestä. :-)


      • sentään?

        (Ampukaa jos sanon väärin) Mielestäni "int* x;" tarkoitaa tyyppiä "osoitin int-tietotyyppiin", mutta "int *x;" on osoitin "int-tietotyyppiin". Jos laittaa "int* a,b;" niin sekä a että b ovat osoittimia, mutta "int *a, b" vain a on osoitin, mutta b pelkkä int.

        Kun määrittelee vain yhden muuttujan, niin nämä ovat sinänsä yhtäpitäviä, mutta ero kuitenkin on käsittääkseni olemassa.


      • sentään? kirjoitti:

        (Ampukaa jos sanon väärin) Mielestäni "int* x;" tarkoitaa tyyppiä "osoitin int-tietotyyppiin", mutta "int *x;" on osoitin "int-tietotyyppiin". Jos laittaa "int* a,b;" niin sekä a että b ovat osoittimia, mutta "int *a, b" vain a on osoitin, mutta b pelkkä int.

        Kun määrittelee vain yhden muuttujan, niin nämä ovat sinänsä yhtäpitäviä, mutta ero kuitenkin on käsittääkseni olemassa.

        Kyllä sen pitäisi olla aivan sama, mihin ne välilyönnit laittaa (tai montako niitä on) osoittimen määrittelyssä. int *x = int* x = int * x = ..

        Jos nyt käsitin oikein, niin tuota jälkimmäistä mitä meinaat, ei voi olla olemassakaan. Osoitin pitää olla aina johonkin konkreettiseen asiaan, kuten osoitin jonkin muuttujan muistipaikkaan, esim. int luku;int *x=&luku. "int-tyyppi" on lähinnä abstrakti käsite, johon ei siis voi viitata millään (tai mitenkään). Näin ollen int *a, b olisi sama kuin int* a, b.


      • coder
        sentään? kirjoitti:

        (Ampukaa jos sanon väärin) Mielestäni "int* x;" tarkoitaa tyyppiä "osoitin int-tietotyyppiin", mutta "int *x;" on osoitin "int-tietotyyppiin". Jos laittaa "int* a,b;" niin sekä a että b ovat osoittimia, mutta "int *a, b" vain a on osoitin, mutta b pelkkä int.

        Kun määrittelee vain yhden muuttujan, niin nämä ovat sinänsä yhtäpitäviä, mutta ero kuitenkin on käsittääkseni olemassa.

        'Jos laittaa "int* a,b;" niin sekä a että b ovat osoittimia, mutta "int *a, b" vain a on osoitin, mutta b pelkkä int. '

        Ei ole näin. Molemmissa tapauksissa vain a on pointteri, b normaali int-muuttuja.


      • näin on
        Mik26 kirjoitti:

        Kyllä sen pitäisi olla aivan sama, mihin ne välilyönnit laittaa (tai montako niitä on) osoittimen määrittelyssä. int *x = int* x = int * x = ..

        Jos nyt käsitin oikein, niin tuota jälkimmäistä mitä meinaat, ei voi olla olemassakaan. Osoitin pitää olla aina johonkin konkreettiseen asiaan, kuten osoitin jonkin muuttujan muistipaikkaan, esim. int luku;int *x=&luku. "int-tyyppi" on lähinnä abstrakti käsite, johon ei siis voi viitata millään (tai mitenkään). Näin ollen int *a, b olisi sama kuin int* a, b.

        Testailin hieman ja noinhan se menee, hyvä että korjasit. Vetelen pipoa hieman syvemmälle ja muistan tämän vastedes :)

        "Jos nyt käsitin oikein, niin tuota jälkimmäistä mitä meinaat, ei voi olla olemassakaan."

        Et käsittänyt oikein, mutta sillä ei ole enää merkitystä.


      • nyyyppä___
        coder kirjoitti:

        'Jos laittaa "int* a,b;" niin sekä a että b ovat osoittimia, mutta "int *a, b" vain a on osoitin, mutta b pelkkä int. '

        Ei ole näin. Molemmissa tapauksissa vain a on pointteri, b normaali int-muuttuja.

        Kiitos kaikille vielä kerran. :-)


    • Mistä tiedämme

      Kielen määrittelyä huolellisesti lukeva tietää, että nämä ovat samoja, koska ne koostuvat neljästä eri "tokenista" (tätä ei voi suomentaa merkiksi, joten sanon, että tunniste). C-kielessä kirjaimista, numeroista ja _-merkistä (alaviiva) voi muodostaa tunnisteita, kunhan ei aloita numerolla. Siten int on tunniste, ja toisaalta myös kielen varattu sana. * on tunniste, joka tässä tarkoittaa pointteria. Joskus se voi tarkoittaa kertolaskua, mutta näissä ei käytännössä mene sekaisin.

      Pikku x on tunniste, joka määrittää muuttujan. Sillä ei ole valmiiksi merkitystä, joten se saa muista tunnisteista merkityksen. Tässä nyt selviää, että se on int*-tyyppiä, joten kääntäjä ei herjaa mitään. Herjauksen näkee, kun käyttää määrittelemätöntä nimeä, vaikkapa näin:

      int main(){
      return keksin_itse;
      }

      Tämä ei siis ole laillinen ohjelma.

      Viimeinen tunniste on lausekkeen lopettava puolipiste ;.

      Välien määrällä selvästi erillisten tunnisteiden välissä ei ole merkitystä, ja koska kysymyksessäsi on selävsti erillisiä tunnisteita, välit eivät vaikuta.

      Vaikkapa int-sanaa ei saa jakaa: "in t" olisi kaksi tunnistetta peräkkäin, eikä tarkoita enää yhtään samaa asiaa kuin int.

      Välillä on merkitystä esim. ja -> -operaattoreiden kanssa. Jos sen nimittäin laittaa tuohon väliin, tulee ja - >, jotka ovat aivan eri asioita. Jälkimmäinen ei edes tarkoita mitään kielen kannalta merkityksellistä.

      Kuitenkin vaikkapa *- ei tarkoita mitään operaattoria yksikseen, joten se tulkitaan aina kertolaskuksi ja negaatioksi. Se voisi olla merkityksellinen vaikka näin:

      a = a *- 1;

      Pikku a:n arvoksi asetetaan se itse kerrrotunna miinus yhdellä. Välttämättä ei ole selvin tapa sanoa asia.

      Toivottavasti C-oppaassasi selitetään tämä tarkasti. Jos ei, niin se on syytä joskus oppia, että osaa kuvitella miten kääntäjä "näkee" lähdekoodin, eikä tee hassuja virheitä.

      • Undefined

        "Viimeinen tunniste on lausekkeen lopettava puolipiste ;."

        C-kielessä puolipiste ei päätä lauseketta vaan lauseen.

        Mitä alkuperäiseen kysymykseen tulee, niin suositeltavampaa on mielestäni kirjoittaa tähtimerkki kiinni muuttujan nimeen:

        int *a = 0;

        Tämä siksi, että joissakin tapauksissa se selventää huomattavasti asioita. Esimerkiksi lauseen int* a, b; voisi helposti tulkita niin, että siinä esitellään kaksi osoitinta, vaikka todellisuudessa vain a esitellään osoittimeksi ja b tavalliseksi muuttujaksi. Suositeltavampi tapa on siis kirjoittaa tuo näin: int *a, b; jolloin heti ensi silmäyksellä näkee mitä lauseella tehdään.


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

    Luetuimmat keskustelut

    1. Miksi jollain jää "talvi päälle"

      Huvittaa kastoa ullkona jotain vahempaa äijää joka pukeutuu edelleen kun olisi +5 astetta lämmittä vaikka on helle keli
      Maailman menoa
      273
      2760
    2. Mitä et hyväksy miehessä/naisessa josta olet kiinnostunut?

      Itse en halua, että miehellä olisi lapsia!
      Ikävä
      210
      1771
    3. Se katse silloin

      Oli hetki, jolloin katseemme kohtasivat. Oli talvi vielä. Kerta toisensa jälkeen palaan tuohon jaettuun katseeseen. Tunt
      Ikävä
      59
      1482
    4. Tiesitkö? Farmi Suomi Kirsikka Simberg on tämän julkkisnaisen tytär - Katso tyrmäävät mallikuvat!

      Oho, aikamoinen ylläri. Tiesitkö?! Kirsikka Simberg on yksi tämän kauden Farmi Suomi -kisaajista. Hänellä ei ole tuttu t
      Suomalaiset julkkikset
      1
      1231
    5. Kaipaaville

      Kerro sun tunteesi ja ajatukset tähän jos et uskalla irl!
      Ikävä
      79
      1176
    6. Tuhdit oluet kauppoihin. Miksi vastustaa?

      8% oluet kauppoihin mutta mikä siinä on että osa politikoista vstustaa ? Kauppa kuitenkin hinnoittelee vahvan oluen ni
      Maailman menoa
      237
      1086
    7. Miten haluaisit

      Että reagoisin jos näkisin sinut nyt?
      Ikävä
      80
      1022
    8. Sinua tulen kyllä ikävöimään pitkään nainen

      mutta oli pakko tehdä päätös oman mielenrauhan vuoksi. Toivottavasti saat elämältä kaiken mitä haluat.
      Ikävä
      52
      953
    9. Tärkeä kysymys!

      Haluatko sinä, mies, minut?
      Ikävä
      75
      851
    10. Kärsämäki rosvojen ja tuhopolttajien kylä?

      Poliisi ampui uhkaava miestä Kärsämäellä. Ja vasta joku poltti rivitalon. Mikä riivaa Kärsämäkisiä? Joko tuulimyllyjen
      Kärsämäki
      15
      750
    Aihe