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 8
perché 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* a
significa 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, a
e qualsiasi altro puntatore lo const char
fa 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, a
viene 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.