Kezdőoldal » Számítástechnika » Programozás » C/C++: Kérdés a pointeraritmet...

C/C++: Kérdés a pointeraritmetikával kapcsolatban?

Figyelt kérdés

Tehát:


char *sp = "Lafenita";


(1) Ez létrehozza a program statikus memóriaterületén a Lafenita sztringet, pontosabban karaktertömböt, és az sp mutató az első karakterére mutat, ugye?


cout << ++*sp << endl;


(2) Az elsőbbségi szabályoknak megfelelően először az indirektségi hivatkozás kerül végrehajtásra, vagyis a kifejezésben szerepel az "L" karakterre mutató pointer. Ezután növeljük az értékét. A tankönyvemből tudom, hogy ez nem 1 bájttal való elmozdulást jelent, hanem a szomszédos elemre való mozgatást. De a szomszédos elem az nem a memóriaterületen szomszédos elem? Mert az elvileg az "a" betű lenne, ehelyett az ASCII táblán mozgunk mert az eredmény "M". És nem értem hogy miért?


cout << sp << endl;


(3) Kiírjuk az sp mutatót, de se indirektség semmi, és az egész sztring kiírásra kerül. Ez a cout kiírás sajátossága hogy a sztringre mutató pointer kiírásánál a teljes sztringet kiírja automatikusan, vagy én nem értem hogy az "sp" miért adja vissza a teljes sztringet.


Ebben a három kérdésre ha válaszolnátok az sokat segítene nekem. Köszönöm, üdv


2013. jún. 27. 21:45
1 2
 1/13 anonim ***** válasza:
49%

(1) igen, a pointer amúgy létrejöhet a stacken is, attól függ, hova írod ezt a sort


(2) a char-t megnöveli eggyel, ami a következő betű, m


(3) ha a cout char pointert kap, akkor 0-ig kiírja az egészet

2013. jún. 27. 22:01
Hasznos számodra ez a válasz?
 2/13 A kérdező kommentje:

(2)-nél vagyis akkor nem a memóriaterületen mozgunk hanem az azon a tárolón lévő érték nő? Ez általánosságban is elmondható a pointereken értelmezett műveletekről?


Nagyon köszönöm a válaszodat, üdv

2013. jún. 27. 22:15
 3/13 anonim ***** válasza:

(1) Nem, a "Lafenita" stringet a kódszegmensen hozza létre, sp mutató az első (pontosabban a nulladik) karakterére mutat, kvázi a kezdőcímére.


(2) Az lenne amit a kolega mondott, ha nem a kódszegmenesen lévő string-re mutatna sp, mivel a kódszegmensen lévő terültet próbálja módosítani ezért csúnyán rácsap a kezedre az Op rendszer, (védett mód) szegmens hibával leáll. Kvázi egy konstanst próbáltál meg felülírni.


(3) Ezt jól megválaszolták.


"(2)-nél vagyis akkor nem a memóriaterületen mozgunk hanem az azon a tárolón lévő érték nő? Ez általánosságban is elmondható a pointereken értelmezett műveletekről? "


Igen.

2013. jún. 27. 23:01
Hasznos számodra ez a válasz?
 4/13 A kérdező kommentje:

Köszönöm a segítségeteket. Most akkor az hogy a sztring hol kerül tárolásra attól függ hogy hová helyezem a C++ programban? globális/lokális?


char *p = "Lafenita";

*p = *p + 1;

printf( "%c", *p );


Itt indirekten hivatkozunk a nulladik karakterre hogy átállítsuk az értékét de az oprendszer le is lövi a folyamatot mert ez tilos.


char *p = "Lafenita";

printf( "%c", *p+1 );


Itt indirekten hivatkozunk a sztring nulladik elemére, megkapjuk az értékét és hozzáadunk 1-et, így kapjuk az ASCII kódtábla következő elemét az M-et.


char *p = "Lafenita";

printf( "%c", *(p+1) );


Itt a p mutatóhoz hozzáadunk 1-et, ami azt jelenti hogy 1*sizeof(adattípus) -al lesz arrébb, magyarán a soron következő elemre ugrunk a memóriaterületen, ami épp az "a" betű.


Ezek jók amiket leírtam?

2013. jún. 27. 23:53
 5/13 anonim ***** válasza:

ja, persze a literált nem fogja neked megnövelni, én úgy értettem az operandust növeli a pre-increment és egyáltalán nem specifikus a pointerekre, integral típusokra megy (benéztem, igen:D)


amit idézőjelek közé írsz, az mindig ugyanott jön létre, függetlenül attól, hová írod (mondjuk pl a printf format stringjei is foglalják a helyet)

2013. jún. 28. 00:24
Hasznos számodra ez a válasz?
 6/13 anonim ***** válasza:

" Most akkor az hogy a sztring hol kerül tárolásra attól függ hogy hová helyezem a C++ programban? globális/lokális?"


A kódszegmensbe mindegy hol van.



"char *p = "Lafenita";

*p = *p + 1;

printf( "%c", *p );


Itt indirekten hivatkozunk a nulladik karakterre hogy átállítsuk az értékét de az oprendszer le is lövi a folyamatot mert ez tilos. "


Így van nem lehet felülírni ahhoz írható memóriaterületen kellene lennie.

Mi az hogy indirekten? Honnan szedted? A char pointer által mutatott memóriahelyre, ami a 0.-ik karaktere a stringnek.


A többi is a megfogalmazást leszámítva helyes.

2013. jún. 28. 00:31
Hasznos számodra ez a válasz?
 7/13 A kérdező kommentje:

*p


Ahol p mutató, indirektségi operátornak nevezi a könyveim (Programozzunk C++ nyelven)

2013. jún. 28. 00:37
 8/13 A kérdező kommentje:

"megfogalmazást leszámítva "


Az indirektségre gondolsz?


Nagyon köszönöm a segítségeiteket, mostmár minden világos. Üdv

2013. jún. 28. 00:38
 9/13 anonim ***** válasza:

"Az indirektségre gondolsz?"


Igen. Még egyszer átgondolva így is jó megfogalmazás, de így még sosem láttam megfogalmazva. (Kipihenten valószínű elég lett volna összesen 1x átgondolnom.)


"

*p


Ahol p mutató, indirektségi operátornak nevezi a könyveim (Programozzunk C++ nyelven)

"

Így aligha írja (bár nincs előttem a könyv). Itt a * az operátor.

2013. jún. 28. 00:55
Hasznos számodra ez a válasz?
 10/13 A kérdező kommentje:
Nagyon köszönöm a segítségeteket. Üdv
2013. jún. 28. 09:51
1 2

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!