Van valami olvasmány amit elolvashatnék, hogy jobban megértsem a pointerek működését C-ben?
"A számítógép memóriájának rekeszei, bájtjai meg vannak számozva. A processzor, amikor szeretne egy változóban tárolt értéket kiolvasni, vagy szeretné módosítani azt, akkor a változó helyét jelző memóriacím (memory address) segítségével hivatkozza meg. Innen tudja a memória, hogy melyik tárolt bájtot kell előszednie, vagy hogy hova tegye a megjegyzendő adatot.
Amikor pointereket használunk a programunkban, tulajdonképp ezekkel a címekkel dolgozunk. A pointer belső ábrázolása egyszerűen a memóriacím."
Esettanulmány a pointer castoláshoz (#18-ra direkt válasz), ez szerintem a kérdezőnek is hasznos lehet (és amúgy javaslom az ilyen jellegű kísérletezést, főleg, ha valami nem világos):
#include <stdio.h>
int main(int argc, int argv[]) {
// Pointer cast
double a = 4.3;
double* p = &a;
int* pint = (int*)p;
double* pp = (double*)pint;
printf("Pointer cast: %f\n", *pp);
// Value cast
int aint = (int)a;
double aa = (double)aint;
printf("Value cast: %f\n", aa);
return 0;
}
Jó gyakorlat megtippelni, hogy mit fog kiírni a program, de azért itt hagyom:
Pointer cast: 4.300000
Value cast: 4.000000
Mi erre a magyarázat? Az első esetben a pointert castoltuk - NEM a mögötte levő adatot -, míg a második esetben az adatot castoltuk. Ami ugye double -> int lépésnél információt veszít, amit az utána következő int -> double nyilván nem tud visszaállítani. Ez nem lép fel a pointer castolásnál.
Sorszámot castolni. Na, az nem semmi.
Tombol az idiotizmus. :(
24
Nem. Azt a változót castolni, ami tárolja a sorszámot (pointer).
Amúgy a pointerek castolása elég gyakori C-ben (főleg, pl. void*-ról arra, ami neked kell)
"A számítógép memóriájának rekeszei" -> látszik, hogy a rekesz jutott eszedbe, huzzál ki és a rekeszből vedd ki a következő sörödet. Kb. az való neked nem a memória meg a bájt meg a tudomisén, hogy mi.
Mikor olvastad ezt a sok zöldséget?
Egy másik kérdés alá írt kommentből kerültem ide.
"A pointerek mibenlétének - azok működésének - megértéséhez a legjobb, ha hardveres oldalról tisztázzuk a dolgokat. A pointer nem más, mint egy memóriacím.
PC-s környezetben a gond általában a pointer aritmetikával szokott lenni, vagy esetenként a címszámítással."
És amikor kitalálták a pointerket a C-ben PC még sehol nem volt (kb. 10 évvel az első PC előtt már létezett C és léteztek pointerek). Hogyan jön ide a címszámítás(?) mi köze a pointerekhez? Te érted amit ide böfögsz, vagy mantrázod továbbra is az elképesztő ostobaságaidat?
A pointer sose volt memória cím. Már csak ha a fogalmat megnézed (és kb. egy kávéscsészénél többet tudsz angolul). A pointer mutatót jelent (angolból magyarra fordítva) a memória cím angolul memory address én nem látok hasonlóságot a két fogalom között. Az, hogy köze van a memóriához és a változókhoz a pointernek az tény, de azt kijelenteni, hogy egy pointer egy memória cím az pont azt jelzi, hogy fogalmad sincs arról, hogy mi a C-ben a pointer. És még itt terjeszted a téves elképzeléseket. Pont ez a téves elképzelés vezet oda (nyilván másnál is olvastam már ezt a tévképzetet), hogy az emberek nem értik meg a pointerek működését és azt, hogy milyen műveleteket és hogyan lehet végezni pointerekkel.
És pont a pointer az ami segít abban C környezetben, hogy platformfüggetlenül tudjunk programot írni és a programozónak ne kelljen ismernie, hogy pontosan hogyan történik a gépben a címfordítás (címszámítás) főleg ha virtuális címzést használ a rendszer (ld. pl. PDP 11 amire az első komolyabb unix és C készült).
27,
Egy hsz-en belül ennyi marhaságot? :)
hát ez nagyon gáz.
28
Ne kezd már megint légyszi, múltkor is kiderült, hogy az a "sok marhaság" az valójában 1 dolog, amiben nincs is igazad.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!