To może być proste pytanie, ale dlaczego const char * nie potrzebuje adresu pamięci, aby wskazywać?
Przykład:
const char* a = "Anthony";
i nie:
const char *a = // Address to const char
jak inne typy?
c++
c
implicit-conversion
c-strings
string-literals
Weidelix
źródło
źródło
Odpowiedzi:
Możesz sobie wyobrazić tę deklarację
w następujący sposób
Oznacza to, że kompilator tworzy tablicę znaków o statycznym czasie przechowywania, który przechowuje ciąg
"Anthony"
a adres pierwszego znaku tablicy (z powodu niejawnej konwersji desygnatorów tablic na wskaźniki na ich pierwsze znaki) jest przypisany do wskaźnikaa
.Oto program demonstracyjny, który pokazuje, że literały łańcuchowe są tablicami znaków.
Wyjście programu to
Rozmiar literału łańcuchowego (tablicy przechowującej literał łańcuchowy) jest równy,
8
ponieważ łańcuch zawiera również kończący znak zero\0'
.W programie demonstracyjnym wyrażenie
może być zastąpione tylko wyrażeniem
źródło
To robi.
Literał C-string jak
jest zepsute na adres jej 1 st charakteru. Podobnie jak BTW; robi to dowolna tablica w C.
źródło
const char[8]
(w C ++, może nie byćchar [8]
w C, nie jestem pewien) i podobnie jak wszystkie wbudowane tablice, gdy używa go jako wartości, rozpada się na wskaźnik do pierwszego elementu.char [8]
w C: c-faq.com/ansi/strlitnotconst.htmlPotrzebuje adresu pamięci i ma adres pamięci. W twoim przykładzie jest to po prostu adres pamięci początku łańcucha. Tak samo jest z każdą inną zmienną tablicową, która została zainicjowana w czasie kompilacji, na przykład „int array [] = {0, 1, 2, 3};”.
Jeśli użyjesz edytora binarnego do sprawdzenia pliku wykonywalnego, zobaczysz tam ciąg „Anthony”. Jeśli wstawisz wiersz „printf („ a jest w% p \ n ”, (void *) a);” w swoim programie, a następnie skompiluj i uruchom go, zobaczysz adres.
źródło
W rzeczywistości tak potrzebujesz adresu pamięci do punktu do.
const char* a
znaczya
wskaźnik do literału lub stałej znakowej.Wskaźnik zawsze wymaga adresu do wskazania, ponieważ charakter wskaźnika wskazuje na określony obiekt w pamięci. Więc,
a
i każdy inny wskaźnik doconst char
.Dosłowny ciąg znaków, taki jak
"Hi My Name is Alfred!"
przy przypisaniu:rozpada się na wskaźnik do adresu pierwszego elementu literału łańcucha.
Oznacza z kolei,
a
zostaje przypisany przez adres pierwszego elementu literału łańcucha"Hi My Name is Alfred!"
który może być przechowywany w dowolnym miejscu w pamięci w zależności od środowiska wykonywania.To nie jest w mocy programisty, gdzie dosłowny ciąg znaków jest dokładnie przechowywany. Twoim zadaniem jest tylko odpowiednie przypisanie i obsługa odpowiedniego wskaźnika.
źródło