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

546

    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. 151
      4305
    2. Katso: Ohhoh! Miina Äkkijyrkkä sai käskyn lähteä pois Farmi-kuvauksista -Kommentoi asiaa: "En ole.."

      Tämä oli shokkiyllätys. Oliko tässä kyse tosiaan siitä, että Äkkijyrkkä sanoi asioita suoraan vai mistä.... Tsemppiä, Mi
      Tv-sarjat
      113
      3904
    3. Voi kun mies rapsuttaisit mua sieltä

      Saisit myös sormiisi ihanan tuoksukasta rakkauden mahlaa.👄
      Ikävä
      23
      2671
    4. Kyllä poisto toimii

      Esitin illan suussa kysymyksen, joka koska palstalla riehuvaa häirikköä ja tiedustelin, eikö sitä saa julistettua pannaa
      80 plus
      28
      1881
    5. "Joka miekkaan tarttuu, se siihen hukkuu"..

      "Joka miekkaan tarttuu, se siihen hukkuu".. Näin puhui jo aikoinaan Jeesus, kun yksi hänen opetuslapsistaan löi miekalla
      Yhteiskunta
      22
      1747
    6. Haluan jutella kanssasi Nainen

      Olisiko jo aika tavata ja avata tunteemme...On niin paljon asioita joihin molemmat ehkä haluaisimme saada vastaukset...O
      Ikävä
      15
      1649
    7. Poliisiauto Omasp:n edessä parkissa

      Poliisiauto oli parkissa monta tuntia Seinäjoen konttorin edessä tänään. Haettiinko joku tai jotain pankista tutkittavak
      Seinäjoki
      19
      1625
    8. Haluan tavata Sinut Rakkaani.

      Olen valmis Kaikkeen kanssasi...Tulisitko vastaa Rakkaani...Olen todella valmistautunut tulevaan ja miettinyt tulevaisuu
      Ikävä
      30
      1543
    9. Hermo mennyt sotealueeseen?

      Nyt hammaslääkäriaika peruttiin neljännen kerran. Perumiset alkoi tammikuussa. Nyt uusi aika elokuulle!????
      70 plus
      91
      1531
    10. Onko mies niin,

      että sinulle ei riitä yksi nainen? Minulle suhde tarkoittaa sitoutumista, tosin eihän se vankila saa olla kummallekaan.
      Tunteet
      18
      1511
    Aihe