Informatika! mutatókat valaki eltudná magyarázni? (többi lent)
van egy vektorom (char V[15]);
és van egy mutatóm (char *p = V)
Mi a különbség a p* és a p között? Ha kiíratom a képernyőre akkor p-esetén megjelenik a képernyőn a vektor karakterláncai által alkotott szó.
Ha p*-ot akkor az első eleme a vektornak.
Mi történik ilyenkor?
Másik kérdésem hogy for ciklusba miért lehet megadni hogy addig csinálja amíg p*?
Nem bánnám ha valaki segítene, azt hogy mik a mutatók, értem.
C++-ba tanulom ezeket.
"Mi a különbség a p* és a p között? "
Először is nem p*, hanem *p
A p egy "char *" típusú változó, vagyis egy olyan pointer, ami char-ra mutat.
V egy tömb, amiben 15 darab karakternek van hely. A C-ben (C++-ban is) ha a tömb nevét kapcsos zárójel nélkül írod, akkor az a tömb kezdőcímét jelenti, vagyis V egy char* típusú pointer. Ezért lehet a p változónak értékül adni (ugyanolyan a két típus.)
Ha csillagot írsz egy pointer típusú változó elé, tehát *p, akkor az azt az értéket jelenti, ahová a pointer mutat. Vagyis esetünkben a V tömb első karakterét.
Ha a pointer értékét növeled eggyel, akkor a rákövetkező elemre mutat. Pl. p+1 a V tömb második elemére mutat, ezért *(p+1) a tömb második karakterét fogja előszedni. Ez pont ugyanaz, mint V[1], és pont ugyanaz, mint p[1]. Pointer és tömb az esetek legnagyobb részében ugyanis felcserélhető fogalmak.
Ha ki akarod írni a pointer értékét, azt elvileg úgy teheted meg, hogy "cout << p;". Viszont abban az esetben, ha a pointer egy char* típusú pointer, mégsem az lesz az eredmény. Ez egy C-ből itt maradt örökség. A C-ben ugyanis nem volt string adattípus, hanem csak karakter tömbök voltak, aminek a típusa pedig char*, ezért a "cout << p" esetén a fordító azt hiszi, hogy régiféle C-s stringet akarsz kiírni. Ha a pointert akarod kiírni, akkor valamilyen másféle pointerré kell átalakítani, mondjuk void*-gá, így:
cout << (void *)p;
Ezt cast-olásnak hívják, azt mondod vele a fordítónak hogy alakítsa (cast-olja) át a char* típusú értéket void*-ra. Azt egyszerűen meg tudja tenni a fordító, a pointer változatlan marad tőle. A void* típusú érték azt jelenti egyébként, hogy olyan pointer, amiről nem mondjuk meg, hogy milyen típusú adatra mutat.
"Másik kérdésem hogy for ciklusba miért lehet megadni hogy addig csinálja amíg p*? "
Ezt a kérdést nem értem. Mit akarsz pontosan?
A char típus egyébként nem karaktert jelent, hanem 8 bites számot, vagyis olyan számot, ami -128 és +127 közötti értékeket vehet fel. Ebbe a tartományba az ASCII kódolású karakterek éppen beleférnek (kicsit több is belefér), ezért az amerikaiak karakterkódokat is ebben szoktak ábrázolni. (Mondjuk a magyar ő és ű betűk nem férnek bele a ma szokásos Unicode kódolással.)
Ha a V tömbben mondjuk ékezet nélküli betűk vannak, max 14 darab, és a végén van még egy záró byte, aminek 0 az értéke, akkor így tudod karakterenként kiírni a V tartalmát:
for (char *p = V; *p != 0; ++p)
cout << *p;
Először a p változó értékül kapja a V tömb kezdőcímét.
Aztán a *p előveszi azt a számértéket, ahová p mutat, és ha ez az érték nem 0, benn maradunk a ciklusban.
Aztán a ciklus törzsében kiíródik a *p, vagyis az aktuális karakter. Ez char típusú, amit a "cout <<" úgy értelmez, hogy nem egy -128..127 közötti számot kell kiírni, hanem karakterkódot.
Aztán a ++p növeli eggyel p értékét, vagyis a pointer a következő byte-ra mutat.
Aztán jön újra a *p != 0 feltétel, stb.
Ha mondjuk az a feladat, hogy a V-ben lévő karakterláncból az első szót kell csak kiírni (a szó azt jelenti, hogy mögötte szóköz van), akkor ilyen ciklusod lehet:
for (char *p = V; *p != 0 && *p != ' '; ++p)
cout << *p;
A feltétel két részből áll most: egyrészt *p!=0 továbbra is azt nézi, hogy ne legyen még vége a karakterláncnak, ezen kívül még annak is teljesülnie kell (&& vagyis "és"), hogy *p!=' ', vagyis amire a p mutat, az nem egy szóköz.
Ez a ' ' két aposztróf között egy darab szóköz, amit a fordítóprogram a szóköz kódjának, vagyis 32-nek fordít le. Ugyanaz, mintha azt írnánk, hogy *p!=32, de jobban olvasható.
Ha ki akarod írni, hogy mik a kódjai a V-ben lévő karakterlánc egyes betűinek, azt mondjuk így teheted meg:
for (char *p = V; *p != 0; ++p)
cout << (int)*p << ' ';
Most kiíráskor nem *p, hanem (int)*p van, ami azt jelenti, hogy az eredeti char típusú adatot alakítsa (cast-olja) át a fordító int-re. A char-t kódként írná ki a cout, az int-et pedig számként. A szám mögé ki fog írni még egy szóközt is a << ' ' miatt.
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!