SOS! A C nyelvben mi az a pointer, illetve mi a sizeof operátor?
Hogy néz ki pl. a v[4] elem mutatós formában ? Példák jöhetnek , egyszerű magyarázatra lenne szükségem !
Kösz !
*v a v[] nulladik eleme
*v + 4 a v[] negyedik eleme
sizeof operátor: a megadott típus által elfoglalt memóriaterület mérete
"*v + 4 a v[] negyedik eleme "
Ez nem igaz. Ez az első elem +4 mivel az indirekció nagyobb precedenciájú és előbb lesz kiértékelve. Helyesen: *(v+4)
A sizeof megadja, hogy egy bizonyos változótípus egy példányát hány bájton tárolja. Pl. char-ra jellemzően 8. Ez egyrészt azért kell, mert nem minden gépen egyeznek meg, illetve mert általad definiált típusokra ez már elég sokféle lehet. (Végülis elméletileg akár ha fejben tartod, akkor saját kezüleg is beírhatnád)
Egy pointer típusú változóban egy memória cím van, amiben eltárolt értéket az indirekció operátorral lehet elérni (*). Egy eltárolt adat memóriacímét pedig a referencia operatárral lehet elérni (&). (tehát a scanf nem a változót kapja meg, hanem annak memória címét)
Az alábbi dekláricó után int *v;
v egy int pointer, amiben egy int-t tartalmazó memória cím van. *v az ezen memória címem eltárolt int érték.
Amikor tömböt deklarálsz, akkor lényegében egy pointert kapsz, de le lesz foglalva adott mennyiségű memória cím is után.
Pl. char v[5];
Ekkor kapsz egy char pointert (v), ami mutatt az első elemre (char típusú 8 bájt, jelenleg nincs benne semmi értelmes) és le lesz foglalva 5*sizeof(char) memória egymás mellett (a legelsőre mutat v).
a v[3] nem más, mint *(v+3). Itt a fordító nem hozzáad v-értékéhez hármat, hanem három sizeof(char)-nyit, tehát pont eleget, hogy a hárommal utána lévő char változót érje el.
v[] lényegében ugyanaz, mint v. Arra jó, hogy amikor függvénynek adod át a változót, akkor két lehetőséged van:
void f(int* v)
vagy f(int v[])
A pointer amúgy még arra (is) jó, hogy a függvénynek adott változókat, azokat lényegében nem kapja meg, hanem csak egy másolatot róluk, amik a függvény lefutása után el is vesznek.
Tehát hiába mondom azt, hogy:
void f(int x){x=10;}
és main-ben meghívom: int x=3; f(x); a main-ben lévő x nem ugyanaz, mint ami a f-ben van. (az f-ban lévő egy másolat róla, ami eleinte 3, aztán 10, aztán elveszik. Ez alatt a főprogramban lévő x végig 3 marad)
Viszont ha átadom a pointerét:
void f(int* x){*x=10;}
main: int x=3; f(&x);
Akkor itt már megváltozik az x. (hisz a memóriacíméről kapott egy másolatot a függvény, amivel már el tudja érni a main-ben lévő x-t és akár meg is változtathatja)
Ezért van, hogy printf("%d", c); (Ahhoz hogy kiírjuk elég ha megkapjuk egy másolatban az értékét), de scanf("%d", &c) (ahhoz hogy beleírjuk hiába kapjuk meg értékének másolatát azzal nem tudjuk elérni, hanem helyette memóriacíme kell, amivel elérhetjük az eredeti változót és beleírhatunk)
Akkor én is javítanék egy kicsit:D
"A sizeof megadja, hogy egy bizonyos változótípus egy példányát hány bájton tárolja. Pl. char-ra jellemzően 8."
Tudtommal a sizeof azt adja meg, hogy hány char-ból áll az adott típus, charra pedig nem jellemzően 8, hanem standard szerint sizeof(char)=1, pont azért mert az az alapegység (értsd, "4 bites bájt" környezetben is sizeof(char)=1)
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!