Kezdőoldal » Közoktatás, tanfolyamok » Házifeladat kérdések » Informatika! mutatókat valaki...

Informatika! mutatókat valaki eltudná magyarázni? (többi lent)

Figyelt kérdés

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.



2016. aug. 24. 11:59
 1/4 A kérdező kommentje:
Jaj és hogy tudom kiíratni magát a mutatót? Merthogy p-elvileg egy mutató, de mikor kiíratom consolra, nem a hexadecimális szám jelenik meg.
2016. aug. 24. 12:03
 2/4 bongolo ***** válasza:

"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?

2016. aug. 24. 22:56
Hasznos számodra ez a válasz?
 3/4 bongolo ***** válasza:

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.

2016. aug. 24. 23:26
Hasznos számodra ez a válasz?
 4/4 A kérdező kommentje:
Köszönöm a válaszodat! Sok minden tiszta lett.
2016. aug. 25. 08:34

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!