Legjobb válasz
(int *) p a p változóban tárolt érték explicit típusa annak a mutatónak a típusára, amelynek címe egész számra mutat. A p által tárolt érték a 4 bájt 1. bájtjának memóriacíme, amelyet az említett 32 bites (4 bájtos) egész szám tárolására használnak.
Egy mutató eltárol egy számot, amely legyen a cím egy adott helyre a memóriában (kupac vagy verem). Az adott helyen tárolt adatok típusa bármi lehet , és ebben a kifejezésben megadjuk (vagy inkább feltételezzük), hogy ez egy 4 bájtos egész szám.
A p értéke típustáblázható, mielőtt egy másik mutatóhoz rendelnék –
int *c = (int *) p;
Vagy kizárható a p birtokában lévő címben tárolt érték lekérése –
int c = *((int *) p);
Vagy, ha a p valóban mutató, akkor anélkül is lehet hivatkozni rá kifejezetten típusú, mivel tudjuk, hogy a benne tárolt érték 4 bájtos egész szám.
Az egyszerűség kedvéért nem ellenőriztem a mutatókat. A legfontosabb, hogy ellenőrizze, hogy a mutató null-e, mert a null nullára való hivatkozás összeomlást eredményez.
Példa nullára ellenőrzés –
if (p != null)
printf(“int is ‘\%d’”, *p);
Feltéve, hogy A cím helyes, és a mutató nem null, és hogy a memória helyén tárolt adattípus valójában egész szám, a konzol helyesen fogja kinyomtatni .
Itt van egy részletes és jól magyarázható cikk, amellyel néhány évvel ezelőtt találkoztam, arról, hogyan kell olvasni a c – óramutató járásával megegyező / spirális szabály
Válasz
Annak érdekében, hogy megértsük, mit csinál ez (int *) ott, hasznos megérteni, hogy mit csinál a malloc (sizeof (int)). “s jobbra-balra.
Először van egy sizeof (int) méret. Ez egy érték, amely a memória egész számának ábrázolásához szükséges bájtok számát jelenti. Ez lehet 4 vagy más szám, attól függően, hogy melyik számítógépen programozunk.
Tehát a malloc () függvény valójában olyan paramétert kap, mint a 4, a la malloc (4). Ez a függvény megkérdezi a C könyvtár, hogy elinduljon valahol a memóriában, és félretegyen 4 bájtot (ami történetesen pontosan akkora méret, hogy egész számot tartalmazzon).
Most a malloc függvény mindig visszaadja ennek a memóriának a címét. a memória sorozatosan van elrendezve, és a memóriában minden cím egyedi. Most a malloc () nem túl intelligens függvény – elmondja neki, hogy mennyi memóriát szeretne, és azt mondja, hogy “itt van”. Nem tudja, mi be akarod helyezni abba a memóriába – csak azt tudja, hogy mennyi memóriát kértél.
Mivel a malloc () nem tudja, hogy mit szeretnél beletenni ebbe a memóriába, egy (void *), vagyis egy tetszőleges memóriacím, más néven mutató. A legtöbb modern számítógépen a cím 64 bites érték, amelyet 8 bájt memóriában lehet megjeleníteni – de a számítógépek különböznek r, és a különböző számítógépek különböző méreteket adhatnak vissza. Tehát a malloc () 8 bájt adatot adhat vissza (void *) formátumban.
Végül be kell jutnunk abba a memóriába, amelyet a malloc () adott nekünk, hogy úgy kezelhessük, mintha egy egész szám. Hogyan csináljuk ezt? malloc () csak mutatott egy emléket valahol az űrben. Ezt úgy tesszük, hogy elmondjuk a fordítónak, hogy a malloc () -ból visszakapott memóriacím valóban egy egész szám címe. Ezért az (int *).
Most mindezt átélte, a fordító aztán teljesen megértette, mit akart, mert minden lépést leírni vett a fáradság: nyolc bájtot szeretne a memóriában egy négy bájtos helyre mutató cím, amely egy egész számot tartalmaz.
És ez az egész kifejezés jelentése!