Consente supponiamo si assegna un valore di NULL
a una funzione prima di chiamare f1
.Ora il modo in cui viene definita f1 prende il suo argomento (puntatore su un valore int
) in base al valore. Quello è b
sarà un'altra variabile di tipo int *
che sarà un copia di a
. Quindi anche b
avrà un valore di NULL
. Ora in f1
si modifica il valore con b
assegnandogli l'indirizzo di memoria assegnato dinamicamente utilizzando malloc
. Diciamo che l'indirizzo di memoria è 0x123
. Come risultato di questo incarico, b
ha cambiato il suo valore da NULL
a 0x123
ma a
(in main
) continua a contenere NULL
, perché la modifica di b non cambierà a
, in quanto sono due variabili separate. Di conseguenza, quando si ritorna dalla funzione f1
a rimarrà invariato.
Ci sono 2 modi per risolvere questo problema. Si può fare la funzione f1
restituire il valore del b
modificato e quindi assegnarlo a un in main
e due, è possibile passare l'a indirizzo in modo che eventuali modifiche apportate in f1
interesseranno a in main
troppo.
// f1 now returns the value of b.
int* f1() {
int *b = malloc(sizeof(int));
*b = 5;
return b;
}
int main() {
int *a = NULL;
a = f1(); // assign the return value of f1 to a.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}
.
// f1 now takes the address of a.
void f1(int **b) {
*b = malloc(sizeof(int)); // you are actually altering a indirectly.
**b = 5;
}
int main() {
int *a = NULL;
f1(&a); // now pass the address of a to f1.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}
Questo è di nuovo passare per valore. stai passando l'indirizzo di un valore. ** Non vi è alcun passaggio per riferimento in C ** – raj
abbastanza giusto. Aggiornato per essere più accurato in C. – Dusty