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?
"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.
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));
"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?
Úúúúúúúú 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 ....
"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.)
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!