C/C++: Kérdés a pointeraritmetikával kapcsolatban?
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
(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
(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
(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.
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?
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)
" 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.
*p
Ahol p mutató, indirektségi operátornak nevezi a könyveim (Programozzunk C++ nyelven)
"megfogalmazást leszámítva "
Az indirektségre gondolsz?
Nagyon köszönöm a segítségeiteket, mostmár minden világos. Üdv
"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.
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!