Weboldalunk cookie-kat használhat, hogy megjegyezze a belépési adatokat, egyedi beállításokat, továbbá statisztikai célokra és hogy a személyes érdeklődéshez igazítsa hirdetéseit. További információ
Kezdőoldal » Számítástechnika » Programozás » Ha C/C++ nyelvekben egy...

Ha C/C++ nyelvekben egy string literálhoz hozzáadunk egy számot, akkor miért "vág le" annyi karaktert az elejéből?

Figyelt kérdés
Pl. printf("hello" + 2); /*llo*/ Pointeraritmetika, azt tudom, de végülis egy string literál az char[] típusú, és nem char*, például a hello az char[6] típusú (c++-ban const char[6]), akkor hol van mégis a pointer? A paraméterátadásban létrejön egy pointer, ami a tömbre mutat?

#C++ #pointer #paraméterátadás #karaktertömb #string literál #pointer aritmetika
nov. 19. 11:46
1 2
 1/14 anonim ***** válasza:
93%
És a karaktertömb (tömb!) végső soron micsoda? Egy mutató. ;)
nov. 19. 11:57
Hasznos számodra ez a válasz?
 2/14 anonim ***** válasza:
0%
1: Pihenj, tanulgass.
nov. 19. 12:01
Hasznos számodra ez a válasz?
 3/14 anonim ***** válasza:
81%
Pointer aritmetikának hívják, a fordító elég okos hogy kitalálja hogy mire mutat egy pointer. A példádban a fordító kitalálja, hogy egy char tömbre mutat a pointer, aminek az elemei sizeof(char) méretűek. A pointer kezdetben itt a 0. elemre mutat, vagyis a 'h' -ra. Szóval ha hozzáadsz kettőt, akkor a pointer lép kettőt jobbra, vagyis az első 'l' -re fog mutatni.
nov. 19. 12:01
Hasznos számodra ez a válasz?
 4/14 anonim ***** válasza:
Továbbá igen, a mivel tömb, ez alapból egy pointer.
nov. 19. 12:03
Hasznos számodra ez a válasz?
 5/14 anonim ***** válasza:
0%

"fordító elég okos hogy kitalálja hogy mire mutat egy pointer"


Nem kell kitalálnia. A memóriában le van tárolva a pointer és az, hogy melyik memóriateruletre mutat.

nov. 19. 14:23
Hasznos számodra ez a válasz?
 6/14 anonim ***** válasza:
0%
És nem is a fordító "találgatja " ezeket. Az opsys feladata már.
nov. 19. 14:24
Hasznos számodra ez a válasz?
 7/14 anonim ***** válasza:

string literaloknál van némi különbség

egyébként mindkettő ugyan az


gondold végig, hogy ezek miben különböznek. Nem egyértelmű egyébként :)


char* a;

char* b = "hello";

const char* c = "helo";

char d[] = "hello";

const char e[] = "hello";


a[0] = 'A'; // NEM OK

printf("c[0] %c \n", a[0]); // NEM OK

printf("sizeof(a): %d \n \n", sizeof(a));


b[0] = 'B'; // NEM OK

printf("b[0] %c \n", b[0]); // OK

printf("sizeof(b): %d \n \n", sizeof(b));


c[0] = 'C'; // NEM OK

printf("c[0] %c \n", c[0]); // OK

printf("sizeof(c): %d \n \n", sizeof(c));


d[0] = 'D'; // OK

printf("d[0] %c \n", d[0]); // OK

printf("sizeof(b): %d \n \n", sizeof(d));


e[0] = 'E'; // OK

printf("e[0] %c \n", e[0]); // OK

printf("sizeof(e): %d \n \n", sizeof(e));

nov. 19. 15:39
Hasznos számodra ez a válasz?
 8/14 anonim ***** válasza:
0%

"a fordító elég okos hogy kitalálja hogy mire mutat egy pointer. A példádban a fordító kitalálja, hogy egy char tömbre mutat a pointer"


Mi vaan?

nov. 19. 15:49
Hasznos számodra ez a válasz?
 9/14 anonim ***** válasza:
9%

Úúúúúúúú jönnek a lepontozások. :D Amikor írod a kódot haver akkor az a pointer nincs sehol. Az csak egy kib@szott karakter a kódodba. :D A fordító sem csinál vele semmit. A fordító csak assembly nyelvre írja át az emberi nyelven megírt kódodat. :D Az assembly-t meg lefordul a kib@szott machine kódra, amit végképp nem értessz még. :D Utána kerülnek be szépen a memóriába. :D A mutató is bekerül egy memóriaterületre, de azon a memóriaterületen megvan cimkézve, hogy az egy "mutató", hiszen a memóriaterületre az másik memóraterületének címe van megadva, hozzátéve, hogy arra kell navigálnia.. :D Onnanstól kezdve már az operációs rendszer feladata, hogy a memóriát kezelje. Annyi alkalmazás van arra, hogy futási időben nézegethesd a memóriát, és nem csak debug, hanem release verziókat is, hiszen a legtöbb csalás ami játékhoz készül, elengedhetetlen, hogy a memóriában túrkálj. :D


Én nem tudok mit mondani, de itt jön be az egyetem kihagyása szerintem. :D Ezt nem oktatják se általánosba, se bootcampbe, se magántanárnál. Van egy olyannak tantárgyak például mérnökinformotikán, ahol az egész kurzus alatt a memóriákkal foglalkoztok. Anno mi még papiron számoltunk memória címeket, és memóriacímtérképekkel kellett foglalkozni. Ez 10 éve volt. Azóta ez is kikerült az oktatásból, mert egyre jobban butítják lefelé. Szóval végülis nem a Ti hibátok, hanem az állam által adott egységes oktatás ....

nov. 19. 15:59
Hasznos számodra ez a válasz?
 10/14 anonim ***** válasza:

"A paraméterátadásban létrejön egy pointer, ami a tömbre mutat?"

Kb. igen. A fordító a string literálokat szépen összegyűjti (az ugyanolyanokat nem ismételve), a saját memóriaterületükre paterolja, és a hivatkozásokban a rájuk mutató pointerként értelmezi. Nagyon leegyszerűsítve kb. úgy kezeli őket, mintha változók lennének, szimbólum (név) nélkül. (Nem pont úgy, mert külön kezeli őket, de hasonló módon pointerekként értelmezi.)

nov. 19. 16:12
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2020, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | WebMinute Kft. | Facebook | Kapcsolat: info@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!