Paras vastaus
(int *) p on nimenomaisen tyypin valu muuttujalle p tallennetun arvon osoittimen tyypille, jonka osoite osoittaa kokonaislukua. P: n tallentama arvo on 4: n ensimmäisen tavun muistiosoite, jota käytetään mainitun 32-bittisen (4-tavuisen) kokonaisluvun tallentamiseen.
Osoitin tallentaa numeron, joka pitäisi olla osoite tiettyyn paikkaan muistissa (kasa tai pino). Tähän sijaintiin tallennetun datan tyyppi voi olla mikä tahansa , ja tässä lausekkeessa määritämme (tai pikemminkin oletamme), että se on 4 tavun kokonaisluku.
p: n arvo voidaan määrittää tyypillisesti ennen kuin se osoitetaan toiselle osoittimelle –
int *c = (int *) p;
Vaihtoehtoisesti voidaan sulkea pois noutamalla p: n hallussa olevaan osoitteeseen tallennettu arvo –
int c = *((int *) p);
Tai jos p todellakin on itse osoitin, siitä voidaan viitata ilman sitä nimenomaisesti -tyyppinen, koska tiedämme, että siihen tallennettu arvo on 4 tavun kokonaisluku.
Yksinkertaisuuden vuoksi en ole tyhjentänyt osoittimia. On tärkeintä, että tarkistat osoittimen olevan nolla, koska nollan osoittimen viittaaminen johtaa kaatumiseen.
Esimerkki nollasta tarkista –
if (p != null)
printf(“int is ‘\%d’”, *p);
Oletetaan, että osoite on oikea ja että osoitin ei ole nolla, ja että muistipaikkaan tallennettu tietotyyppi on itse asiassa kokonaisluku, konsoli tulostaa sen oikein .
Tässä on yksityiskohtainen ja hyvin selitetty artikkeli, jonka törmäsin muutama vuosi sitten, siitä, kuinka voit lukea osoittimia c – myötäpäivään / spiraalisääntöön
vastaus
Jotta ymmärtäisit mitä (int *) siellä tekee, on hyödyllistä ymmärtää mitä malloc (sizeof (int)) tekee. ”s jaa se oikealta vasemmalle.
Ensinnäkin meillä on sizeof (int). Tämä on arvo, joka edustaa tavujen määrää, joka tarvitaan kokonaisluvun esittämiseen muistissa. Tämä voi olla 4 tai jokin muu numero, riippuen siitä, mihin tietokoneeseen ohjelmoimme.
Joten malloc () -funktio saa oikeastaan parametrin, kuten 4, a la malloc (4). Tämä toiminto kysyy C-kirjasto menee pois jostakin muistista ja varaa 4 tavua (joka sattuu olemaan täsmälleen oikean kokoinen kokonaislukua varten).
Nyt malloc-funktio palauttaa aina muistin osoitteen. Muista tämä tietokone muisti on järjestetty sarjaan, ja jokainen muistissa oleva osoite on ainutlaatuinen. Nyt malloc () ei ole kovin älykäs toiminto – kerrot sille kuinka paljon muistia haluat, ja siinä sanotaan ”tässä se on”. Se ei tiedä mitä haluat laittaa siihen muistiin – se tietää vain kuinka paljon muistia pyysit.
Koska malloc () ei tiedä mitä haluat laittaa muistiin, se palauttaa tyypin nimeltä (void *), eli mielivaltainen muistiosoite, joka muuten tunnetaan osoittimena. Useimmissa nykyaikaisissa tietokoneissa osoite on 64-bittinen arvo, joka voidaan esittää 8 tavua muistia – mutta tietokoneet eroavat toisistaan r, ja eri tietokoneet saattavat palauttaa erikokoisia. Joten malloc () voi palauttaa 8 tavua tietoja (void *) -muodossa.
Lopuksi meidän on päästävä sisälle siihen muistiin, jonka malloc () antoi meille, jotta voimme kohdella sitä sisältävän kokonaisluku. Kuinka voimme tehdä sen? malloc () antoi meille vain osoittimen muistille jossain avaruudessa. Teemme sen kertomalla kääntäjälle, että mallocilta () saamamme muistiosoite on oikeastaan kokonaisluvun osoite. Siksi sinun (int *).
Nyt olet käynyt läpi kaiken, kääntäjä ymmärtää sitten täysin, mitä halusit, koska olet ottanut vaivaa kuvata jokaista vaihetta: haluat kahdeksan tavun osoite, joka osoittaa muistin nelitavuiseen sijaintiin, joka puolestaan sisältää kokonaisluvun.
Ja sitä koko lauseke tarkoittaa!