Questa potrebbe essere una semplice domanda, ma perché un carattere const * non ha bisogno di un indirizzo di memoria a cui puntare?
Esempio:
const char* a = "Anthony";
e non:
const char *a = // Address to const char
come fanno altri tipi?
Questa potrebbe essere una semplice domanda, ma perché un carattere const * non ha bisogno di un indirizzo di memoria a cui puntare?
Esempio:
const char* a = "Anthony";
e non:
const char *a = // Address to const char
come fanno altri tipi?
Risposte:
Puoi immaginare questa dichiarazione
const char* a = "Anthony";
il seguente modo
const char string_literal[] = "Anthony";
const char *a = string_literal;
Cioè il compilatore crea una matrice di caratteri con la durata di memorizzazione statica che memorizza la stringa "Anthony"e l'indirizzo del primo carattere della matrice (a causa della conversione implicita di designatori di matrice in puntatori ai loro primi caratteri) viene assegnato al puntatore a.
Ecco un programma dimostrativo che mostra che i letterali stringa sono array di caratteri.
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
L'output del programma è
The size of the referenced array is 8
Anthony
La dimensione del valore letterale stringa (dell'array che memorizza il valore letterale stringa) è uguale a 8perché la stringa include anche il carattere zero finale ' \0'.
Nel programma dimostrativo l'espressione
std::extent<std::remove_reference<decltype( r )>::type>::value
può essere sostituito solo con l'espressione
sizeof( r )
perché un const const non ha bisogno di un indirizzo di memoria a cui puntare? *
Lo fa.
Un letterale di tipo C-string
"Anthony"
è decaduto all'indirizzo del suo primo carattere. Come, BTW; qualsiasi matrice in C. fa.
const char[8](in C ++, potrebbe essere char [8]in C, non sicuro) e come tutti gli array incorporati, quando lo usa come valore decade in un puntatore al suo primo elemento.
char [8]in C: c-faq.com/ansi/strlitnotconst.html
Ha bisogno di un indirizzo di memoria e ha un indirizzo di memoria. Nel tuo esempio è semplicemente l'indirizzo di memoria dell'inizio della stringa. È lo stesso con qualsiasi altra variabile di array inizializzata in fase di compilazione, ad esempio "int array [] = {0, 1, 2, 3};".
Se hai usato un editor binario per guardare l'eseguibile, vedresti la stringa "Anthony" lì dentro. Se inserisci la riga "printf (" a è a% p \ n ", (void *) a);" nel tuo programma, quindi compilalo ed eseguilo, vedrai l'indirizzo.
"Perché non
const char*è necessario un puntatore a un indirizzo di memoria?"
In realtà, ha bisogno di un indirizzo di memoria a cui puntare.
const char* asignifica aè un puntatore a una stringa letterale o costante di carattere.
Un puntatore richiede sempre un indirizzo a cui puntare perché è la natura di un puntatore a puntare a un oggetto specifico in memoria. Quindi, ae qualsiasi altro puntatore lo const charfa anche.
Una stringa letterale come "Hi My Name is Alfred!"da un compito come:
const char* a;
a = "Hi My Name is Alfred!";
decade in un puntatore all'indirizzo del primo elemento della stringa letterale.
Significa a sua volta, aviene assegnato dall'indirizzo del primo elemento della stringa letterale "Hi My Name is Alfred!"che può essere archiviato in qualsiasi punto della memoria in base all'ambiente di esecuzione.
Non è nella potenza di un programmatore dove un letterale stringa è memorizzato esattamente. Il tuo compito è solo quello di assegnare e gestire il rispettivo puntatore in modo appropriato.