Dato il seguente codice C++ che ho trovato in rete, ho dubbi nell'interpretarlo:
void fun(char *s); // non altera la stringa
int main() {
  char const hello[] = “ciao“;
  fun(hello) // errore
  // cannot convert parameter 1 from 'const char [5]' to 'char *‘
  fun(const_cast<char *>(hello)); // OK
return 0; }
Se ben capisco la dichiarazione 
 char const hello[] = “ciao“ o meglio la sua definizione crea un puntatore 
hello costante, la cui area di memoria viene riservata alla stringa 
ciao.
Se non capisco male il nome di un array è sempre dichiarato come puntatore costante quindi non è necessario esplicitarlo con 
char const hello[] o sbaglio? Primo dubbio.
Detto questo perchè il compilatore restituisce errore quando chiamo 
fun(hello)? 
Durante il passaggio del parametro attuale 'hello' dovrei far altro che copiare l'indirizzo di memoria contenuto in 
hello nel puntatore 
s, non sto cambiando il valore di 
p. Giusto? Perchè il compilatore da errore ?Questo è il secondo dubbio
Per la seconda domanda provo a rispondermi da solo:
non c'e' coerenza tra tipo argomento attuale e formale, il primo è un puntatore costante a char mentre il secondo è soltanto un puntatore a char, provo a lanciarmi e affermo che il compilatore non avrebbe restituito errori se avessi avuto una situazione inversa cioè se il const fosse stato presente nel parametro formale. Corretto?