Hmm w sumie już prawie wszystko zostało wytłumaczone, ale skoro zostałem wywołany do tablicy to coś napiszę.
Generalnie "asdf" w C/C++ to tzw. string literal (konkretniej w C++11 to jest ordinary string literal). Zgodnie z definicją w standardzie taki literal ma trzy ciekawe dla nas cechy:
- Jest lvalue (locator value), czyli de facto określa jakiś obiekt który jest "gdzieś" w pamięci.
- Ma static storage duration, to znaczy, że standard gwarantuje, że w dowolnym momencie działania programu ten obiekt jest w pamięci (identycznie jak zmienne globalne czy statyczne).
- Jest typu "array of char" (w C i chyba w starszych C++ też) lub "array of const char" (w nowszych standardach C++).
Oczywiście typ który zwraca funkcja to "pointer to a const char", natomiast ja sobie w kodzie robie bezczelnie "return array of const char".
Zezwala na to mechanizm, który nazywa się array-to-pointer conversion, który mówi w zasadzie to co napisaliście wyżej, czyli:
An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue
of type “pointer to T”. The result is a pointer to the first element of the array.
Czyli:
da identyczny efekt jak:
Kopiuj
return &"asdf"[0];
Przy czym wspomnę od razu, że o ile zwracanie adresu string literal jest legalne, to zwracanie adresu lokalnej tablicy charów jest ofc bardzo złym pomysłem. Anty-przykład:
Kopiuj
const char *func() {
char a[] = "asdf";
return a;
}
(chodzi o to, że obiekt "a" przestaje istnieć od razu po wyjściu z funkcji i dostęp do niego wg standardu jest "undefined")
Generalnie wydaje mi się, że string jest pewną tablicą char-ów, która zakończona jest null-bytem (i wygląda to tak zarówno w C jak i C++ - czy mam rację?).
Tak, dokładnie. Przy czym na "string jako stała w kodzie" zazwyczaj mówi się ładnie "string literal" (żeby konkretnie doprecyzować, że chodzi o string zdefiniowany w kodzie, a nie o zmienną typu string; przy czym nie mam pojęcia jak po polsku jest "literal" - może "literał?" anyone?).
No i jak zostało napisane wyżej, trzeba uważać, żeby nie mylić "stringu w rozumieniu C" (zwanego, co było też wyżej powiedziane, c-stringiem) z klasą std::string w C++.
EDIT: A btw, wygląd na to że milion lat temu na 4p wrzuciłem jakiś losowy post o traktowaniu string literałów jako tablicy - Kruczki i sztuczki C cz. 1 (gdzieś tak w połowie).