Salve, sono nuovo e non vorrei scavalcare candaluar che già sta aiutando Kevin.
io ho studiato un pò di c++ alle superiori e un pò di c all'università. Per ora sto cercando di approfondire il c per mio conto, quindi se scrivo bagianate perdonatemi.
il passaggio di valori è stato pure un mio problema ai tempi, forse ora l'ho capito meglio.
Innanzitutto kevin, è bene che tu capisca che "concettualmente" ci sono 2 tipi di passaggio dei parametri:
Passaggio Per valore : da una copia della variabile, il valore passato non subisce variaioni nella funzione chiamante.
Passaggio per indirizzo: passa la posizione in memoria della variabile, cosi facendo le varie modifiche si riperquotono pure dentro la funzione chiamante.
Nel c il passaggio per indirizzo avviene tramite puntatori, in c++ hanno aggiunto una semplificazione, il passaggio per riferimento che stai usando.
Fatta questa premessa, è facile rispondere alla tua domanda. Usa il passaggio per riferimento (versione c++ del passaggio tramite puntatori) solo se vuoi che i valori vengano modificati , altrimenti passali per valore.
Poi, questo codice è pieno di errori
bool input (char s[]){
bool ok;
for(int i=0; i<strlen(s);i++)
if(!((s[i]>'0'&&s[i]<'9')||s[i]='*'))
return false;
if (!ok) (ok non è inizializzata)
Cout<<"caratteri non ammessi"<<endl; (la c minuscola)
return false;
Return true; (R minuscola, ed 2 return di fila non hanno senso)
}
il c++ è CASE SENSITIVE, quindi attento a minuscole e maiscole, inoltre attento a quando apri e chiudi le parentesi graffe, e consiglio usa l'identazione,cioè spazi dal lato del rigo per identificare meglio i vari blocchi, come ho fatto io.
inoltre ricorda che se non usi le parentisi graffe, solo l'istruzzione successiva è legata ai vari costrutti,
if (!ok) (ok non è inizializzata)
Cout<<"caratteri non ammessi"<<endl; (la c minuscola)
return false;
il return in questo caso non si lega al if.
Per lo meno questo è quello che ho notato fino ad ora.