@Chce_byc_programista:
Dopowiem do @Miang
W pierwszym
"zarezerwuj mi tablicę na tyle, aby się zmieściła inicjacja" oraz "zainicjuj mi z pamięci tylko do odczytu" (przy czym zainicjowanie odbywa się zanim się zacznie wykonywać main()
)
W drugim
"użyj napisu z pamięci tylko do odczytu"
Ścisła deklaracja na ten przypadek to by była
const char* a = "eeeeddffeee";
Różnią się zużyciem pamięci, na współczesnym kompie nie ma to żadnego znaczenia, ale na jakimś chudopachołku ? Albo mikrokontrolerze?
W pierwszym N+1 pamięci RAM oraz N+1 pamięci ROM (umownie, co by to znaczyło *)
W drugim wskażnik, np 4 bajty (albo 8 lub 2) i N+1 w pamięci ROM.
*)
Ten "ROM" to na pecetowskich jest część pliku EXE, która zawiera stałe załadowana jako chroniony segment do RAM, ale na mikrokontrolerach to prawdziwy ROM / flash / co tam mają (opowieść ma więcej komplikacji, na popularnych AVR które sa silnikiem najbardziej popularnych Arduino, jest jeszcze bardziej skomplikowane, ale nie o tym wątek)
Zwykle na takich maluchach z pamięcią RAM jest bardzo cienko (256bajtów - 1-2-4 kB), z ROM nieco lepiej (najmniej 2-4kB, do 32kB), ale tam siedzi też kod programu.
jakby było
char a[] = "eeeeddffeee";
char* b=a;
b[3] = 'X';
to tak by przeszo
Przeszło lub nie. To że się da oszukać kompilatorowi rzutowanie const
na zwykłe (a ono tam jest ukryte), to nie znaczy ze to 100% niezawodne. Chyba jest to listowane jako UB. Na uK by było kiszka