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

600

    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. Sanna Marin teki sen, mihin muut eivät pystyneet - sote kerralla maaliin

      Yli 15 vuotta Suomessa vatvottu sote-uudistus meni lopulta läpi Sanna Marinin hallituksen aikana. Edeltävät hallitukset
      Maailman menoa
      126
      10852
    2. Marinin hallitus hyväksyi soten (105-77) vuonna 2021

      vastaan äänesti Kok, persut, KD, Liike Nyt. Nyt on sitten käynyt niin kuin on käynyt. Pääkirjoitus: Sanna Marin jätti
      Maailman menoa
      112
      6206
    3. Kannattaako suomalaisen duunarin enää äänestää vasemmistopuolueita

      sillä eivät ne tunnu kovasti ajavan suomi-duunarin etuja. Jos katsotaan Vasemmistoliittoa, niin sehän on ihan feministi
      Maailman menoa
      163
      5527
    4. Jaaha, sitä on vasemmistoryhmä käynyt häiriköimässä Purran kodin vieressä

      On näköjään iso lakana levitetty puiden väliin, jossa lukee mm. "Haista vi*** Riikka Purra". Tunkekaa leikkaukset pers..
      Maailman menoa
      55
      5386
    5. Enää viisi yötä Sannan kirjaan

      Ihan täpinöissään tässä odotellaan. Vaikea pysytellä aloillaan, kun koko ajan tekisi mieli jo kirjakauppaan rynnätä, mut
      Maailman menoa
      70
      4329
    6. Professori: Maahanmuuttajien rikollisuutta hyssytellään - hävytöntä

      Kriminologi Jukka Savolaisen mukaan ikä ja vaikeat olosuhteet eivät riitä selitykseksi. – Tutkitun tiedon valossa sanoi
      Maailman menoa
      123
      4279
    7. Mistä kummasta voi johtua se, että vasemmistolaiset usein häpeää itseään

      voiko se johtua esim. köyhyydestä? Ja tästä on siis ihan suomalainen tutkimus olemassa. "Suomalainen tutkimus osoittaa
      Maailman menoa
      24
      3807
    8. Sanna-kulttilaiset hehkuttaa edelleen Marinia, vaikka esim. Sote oli susi jo syntyessään

      mutta kulttilaiset eivät ole järjen jättiläisiä, ja sanoihin Lasse Lehtinenkin, että Suomessa on pohjoismaiden tyhmimmät
      Maailman menoa
      51
      3801
    9. Marin teki sen mihin muut eivät pystyneet, vei susi-Soten maaliin

      ja sitten hävittyjen vaalien jälkeen lähtikin vastuuta pakoon...... "Professori: sote-uudistus on täysi susi. Sosiaali
      Maailman menoa
      13
      3476
    10. IL - 100 000 potentiaalista sotilasta pakeni Ukrainasta!

      "Ukrainasta nuorten miesten joukkopako Liki 100 000 asevelvollisuusikäistä miestä on poistunut Ukrainasta parin viime k
      Maailman menoa
      78
      3062
    Aihe