Come cambiare il valore della variabile passata come argomento?

Come cambiare il valore della variabile passata come argomento in C? Ho provato questo:

void foo(char *foo, int baa){ if(baa) { foo = "ab"; } else { foo = "cb"; } } 

e chiama:

 char *x = "baa"; foo(x, 1); printf("%s\n", x); 

ma stampa baa perché? Grazie in anticipo.

Volete cambiare dove punta un char* , quindi dovrete accettare un argomento in foo() con un ulteriore livello di riferimento indiretto ; un char** (puntatore a un puntatore char ).

Quindi foo() verrebbe riscritto come:

 void foo(char **foo /* changed */, int baa) { if(baa) { *foo = "ab"; /* changed */ } else { *foo = "cb"; /* changed */ } } 

Ora quando chiami foo() , passerai un puntatore a x usando l’operatore address-of ( & ):

 foo(&x, 1); 

Il motivo per cui lo snippet errato stampa baa è perché stai semplicemente assegnando un nuovo valore alla variabile locale char *foo , che non è correlata a x . Pertanto il valore di x non viene mai modificato.

Ci sono più problemi:

 void foo(char *foo, int baa) { if (baa) foo = "ab"; else foo = "cb"; } 

Questo codice cambia il puntatore locale, ma non fa nulla con esso. Per copiare le stringhe, devi usare strcpy() per mantenere l’interfaccia uguale:

 void foo(char *foo, int baa) { if (baa) strcpy(foo, "ab"); else strcpy(foo, "cb"); } 

Tuttavia, prima di farlo, è necessario assicurarsi che foo nella funzione punti in memoria modificabile. Il codice chiamante deve essere modificato per garantire che:

 char x[] = "baa"; foo(x, 1); printf("%s\n", x); 

In alternativa, puoi mantenere x come puntatore e rivedere l’interfaccia della funzione:

 void foo(char **foo, int baa) { if (baa) *foo = "ab"; else *foo = "cb"; } 

e la sequenza chiamante:

 char *x = "baa"; foo(&x, 1); printf("%s\n", x); 

Entrambi i meccanismi funzionano, ma lo fanno in modi diversi. Ci sono diversi gruppi di problemi con ciascuno. Non c’è una sola decisione “questa è meglio di quella”; che è meglio dipende da circostanze al di fuori dell’ambito dei frammenti di codice mostrati.

La domanda è intitolata in modo generico. Hai già le risposte per il tuo problema specifico. Aggiungerò un paio di esempi illustrativi per i tipi int e double .

 #include  void incrementInt(int* in, int inc) { *in += inc; } void incrementDouble(double* in, double inc) { *in += inc; } int main() { int i = 10; double d = 10.2; printf("i: %d, d: %lf\n", i, d); incrementInt(&i, 20); incrementDouble(&d, 9.7); printf("i: %d, d: %lf\n", i, d); } 

Produzione:

 i: 10, d: 10.200000 i: 30, d: 19.900000 

nella funzione pippo, stai cambiando argomento solo localmente. quando la funzione pippo termina, l’argomento x è ancora x. Non l’hai cambiato in foo. l’hai solo copiato e chiamato foo.

inoltre, guarda il commento di @Greg Hewgill.