Allora tutte le volte che passi un array ad una funzione in verità passi solo la posizione del primo elemento anche se poni const (infatti puoi scrivere char scritta[] come char *scritta che sono equivalenti). La funzione a priori non conosce la dimensione del vettore e qui salta in gioco la seconda variabile passata che è grandezza ed equivale alla dimensione in byte dell'array.
Se nel main scrivessi
codice:
const char scritta[]={"Saluda Andonio!"};
 cout<<sizeof(scritta);
avrei come stampa 16 che sono i byte di scritta[]
se invece dalla funzione anche se const scrivessi cout<<sizeof(array_passato) avrei come stampa 4 (32bit) o 8 (64bit) che sono la dimensione del puntatore come aveva detto shodan.
Con questa funzione
codice:
void stampa(char scritta[],int grandezza){
  CharToOemBuffA(scritta,scritta,grandezza);
  for(int i=0;i<grandezza;i++)
    cout<<scritta[i];
  cout<<endl;
}
La funzione riceve il primo elemento del tuo array NON const perché poi dovrà essere modificato con CharToOemBuffA e sarebbe stato impossibile modificarlo se fosse stato definito const
Ora scritta puntatore e strano[0] hanno lo stesso indirizzo, ciò che accade ad uno accade anche all'altro quindi anche l'array di partenza(strano[]) viene modificato alla chiamata di CharToOemBuffA. Il comando CharToOemBuffA prende l'array puntatore, lo converte conoscendo la sua dimensione (grandezza) e lo sovrascrive a quello iniziale.
Puoi richiamare la funzione con qualsiasi array tu abbia dichiarato nel main
codice:
char scritta[]={"Saluda Andonio!"};
char scritta2[]={"èéòàùì"};
stampa(scritta,sizeof(scritta));
stampa(scritta2,sizeof(scritta2));
Spero di essere stato d'aiuto e di non aver scazzato qualcosa