La cosa e' molto piu' semplice di quello che credi.
Non e' la variabile puntatore che contiene la stringa (e' sbagliato dire una cosa del genere, in quanto la variabile puntatore contiene sempre l'indirizzo per puntare alla stringa).
Il fatto e' di "come" viene interpretata la variabile dall'entita' che visualizza il dato.
La cout, se non specifichi che il dato deve essere "interpretato" numericamente, sapendo che e' un puntatore a char, ne mostra automaticamente il "valore" puntato.
Con la printf ti renderai conto meglio che il dato puo' essere interpretato come meglio si crede. Con questa funzione lo si fa attraverso il codice di formattazione passato come argomento.
Nel tuo codice per esempio, se scrivi
printf("%s", a);
stai indicando al compilatore che a deve essere interpretato come puntatore a una stringa e che bisogna visualizzare tale stringa. Questo comporta la generazione automatica di codice tale che si accede al contenuto puntato dal puntatore e non al suo valore.
Se pero' scrivi
printf("%p", a);
oppure
printf("%x", a);
stai indicando al compilatore di generare il codice atto a visualizzare il valore del puntatore stesso e non il valore puntato, e visualizzarlo in esadecimale.

Rispondi quotando