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?
Asteriksin (*) käyttö osoittimien kanssa
9
551
Vastaukset
- 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
57-vuotiads muka liian vanha töihin?
On tämä sairas maailma. Mihin yli 55-vuotiaat sitten muka enää kelpaavat? Hidasta itsemurhaa tekemään, kun eläkkeelle ei3454088Haluatteko miellyttää kumppaninne silmää?
Entä muita aisteja? Mitä olette valmiita tekemään sen eteen että kumppani näkisi teissä kunnioitettavan yksilön? Olette2782307By the way, olet
mielessäni. Olet minulle tärkeä, niin suunnattoman tärkeä. En kestäisi sitä jos sinulle tapahtuisi jotain. Surullani ei1291650Onko kaivattunne suosittu?
Onko teillä paljon kilpailijoita? Mies valitettavasti näyttää olevan paljonkin naisten suosiossa :(971431J-miehelle toivon
Hyvää yötä. Voisiko nykyistä tilannetta uhmaten vielä pienintäkään toivetta olla, päästä kainaloosi joskus lepääämään.851403Täytyi haukkuu sut lyttyyn
En haluu tuntee rakkautta sua kohtaan enää ja haluun unohtaa sut mut sit tulee kuiteki paha olo kun haluis vaan oikeesti611267- 591238
Kylpyläsaaren Lomakylän kahvilaravintola
Kävimme syömässä Kylpyläsaaressa. "Naudanliha burgeri" maksoi 18,90 euroa ja lisäksi limsa 4,50 euroa. Annoksen hinnaks541110Onkohan sulla enää tunteita
kun nähdään seuraavan kerran? Niin hyvä fiilis on ollut viime aikoina, että se on nyt pahin pelkoni. Oletkohan unohtanut361074Rakkauden riemuvoitto
Valta voidaan voittaa tiedolla. Mutta tieto on huonompi kuin kauneus, hellyys ja rakkaus. Siksi kauneus on vallan ja tie3431006