Mit jelent az (int *) p?


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!

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük