C++-ban a sztringliteráloknak mi a pontos típusa? Const char [karakterszám+1] vagy const char *?





"Const char [karakterszám+1] vagy const char *"
Az a vicces, hogy a kettő kb. ugyanaz, vagyis char elemű tömbre mutató pointer (vagy referencia). A sztring maga egy tömb, de a forráskódban pointerként jelenik meg.





A pontos típusa const char[N+1] ahol N a karakterek száma, a +1 meg a \0.
#include <iostream>
template<std::size_t N>
void print_length(const char(&)[N])
{
std::cout << N << '\n';
}
int main()
{
const char str[] = "Hello World!";
print_length(str);
}





"A pontos típusa const char[N+1]"
Nem kötözködésképpen, de ilyen típus nincs.
Pl. ezek csak a generált kódban térnek el, amúgy ugyanaz a típusuk:
const char str[8] = "abc";
const char str[128] = "abc";
const char str[] = "abc";
const char * str = "abc";





"Nem kötözködésképpen, de ilyen típus nincs."
Pedig van.
"Pl. ezek csak a generált kódban térnek el, amúgy ugyanaz a típusuk:"
A felsoroltak közül mindegyiknek eltérő a típusa.





Akkor miért helyes mindegyik, pedig a jobbértékek mind azonosak. :)
ELemszámban persze különbözhetnek, a sizeof is képes felismerni őket, de az más történet.
Az alábbi két kifejezés pl. teljesen egyenértékű, függetlenül attól, hogy az 'a' hogyan lett deklarálva:
*(a+2)
a[2]





"Akkor miért helyes mindegyik, pedig a jobbértékek mind azonosak. :)"
Ezen logikád alapján.
int i = 5;
float f = 5;
double d = 5;
"ELemszámban persze különbözhetnek, a sizeof is képes felismerni őket, de az más történet."
Mivel az elemszám a típus része ezért annyira nem más történet.
"Az alábbi két kifejezés pl. teljesen egyenértékű, függetlenül attól, hogy az 'a' hogyan lett deklarálva:"
Ez miatt nem lesz azonos a típusuk, a *(a+2) azért működik mert:
"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 temporary materialization conversion (7.4) is applied. The result is a pointer to the first element of the array."
Az pedig nem meglepő, hogy teljesen egyenértékű, definíció szerint az:
"The expression E1[E2] is identical (by definition) to *((E1)+(E2))"





Ezek szerint a sztring literálok a hosszuktól függően más-más típusúak? :D
Kicsit szezon és fazon jellegű lenne ez a vita...





Az int/float.. példád jogosnak látszik, de ott implicit típuskonverzió működik, azok konkrétan különböző módon tárolják azt a számot. A sztringet egy pointer fogja reprezentálni a kódban, maga a memóriatömb (x bájtnyi összefüggő terület) egy másik történet. És igen, definíció szerint, az a lényeg.
Asszem léptem...
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, 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!