Perché const char * non ha bisogno di un puntatore a un indirizzo di memoria?


18

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?


8
Cosa ti fa pensare che i letterali di stringa non abbiano indirizzi di memoria?
user207421

2
Concordato. Non mi aspetterei che qualcuno che fa questa domanda sappia nemmeno che esistono categorie di valori , figuriamoci che hanno nomi.
user4581301

13
Si prega di non porre domande taggate con C e C ++. Come possiamo osservare, le risposte sono ora specifiche per C ++ e i commenti deragliano di nuovo sulle differenze tra le due lingue. Ormai ci sono così tante differenze che è difficile porre una domanda che abbia effettivamente la stessa risposta valida per entrambe le lingue. Decidi quale lingua vuoi usare prima di chiedere, per favore.
larkey,

Risposte:


26

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 )

5

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.


Più specificamente, è di tipo 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.
Nikos C.,

@NikosC .: Grazie per avermi ricordato il verbo magico più importante in questo contesto! ;)
alk

Grazie per la risposta! Mi chiedevo da dove prendesse la memoria.
Weidelix,

1
Non posso parlare per C, ma sono abbastanza sicuro che C ++ non specifica dove deve essere memorizzato un valore letterale. Sono appena andato a scavare. Se c'è una regola, è sepolto da qualche parte strano e lontano da qualsiasi menzione di "stringa letterale".
user4581301


1

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.


0

"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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.