L' ho corretto considerando anche l' indentazione, che era un casino:

codice:
int main(void) 
{
    char *P[] = {"gennaio", "febbraio","marzo", "aprile", "", ""};
    char *A ;
    char **B;
    char * E [5] ;
    A = P[3]  ;
    B = &A ;
    E[0] = B ;
    printf("%s\n",  A);
    printf("%s\n",  *E[0]);
    return 0;
}
Se P si trova all' indirizzo mille, ciò non ha nessun legame con le stringhe che si trovano in P[0],...,P[5].
Se la stringa P[0] si trova all' indirizzo 2000 nell' area di sola lettura, P contiene l'indirizzo 2000 come valore, ma il puntatore non è memorizzato all' indirizzo 2000.
Deferenziando E[0], che contiene l' indirizzo in cui è contenuto il puntatore che punta alla stringa P[3], ottieni proprio l' indirizzo della stringa P[3].