Ricerca…


introduzione

Lo scopo di questa sezione è di spiegare le differenze di teoria e implementazione per ciò che accade con i parametri di una funzione al momento della chiamata.

Nel dettaglio i parametri possono essere visti come variabili prima della chiamata di funzione e all'interno della funzione, dove il comportamento visibile e l'accessibilità a queste variabili differiscono con il metodo utilizzato per passarle sopra.

Inoltre, la riusabilità delle variabili e dei rispettivi valori dopo la chiamata alla funzione è spiegata da questo argomento.

Chiama per valore

Dopo aver chiamato una funzione, ci sono nuovi elementi creati nello stack del programma. Questi includono alcune informazioni sulla funzione e anche lo spazio (posizioni di memoria) per i parametri e il valore di ritorno.

Quando si consegna un parametro a una funzione, il valore della variabile utilizzata (o letterale) viene copiato nella posizione di memoria del parametro della funzione. Ciò implica che ora ci sono due posizioni di memoria con lo stesso valore. All'interno della funzione lavoriamo solo sulla posizione della memoria dei parametri.

Dopo aver lasciato la funzione, la memoria sullo stack dei programmi viene spuntata (rimossa) che cancella tutti i dati della chiamata di funzione, inclusa la posizione di memoria dei parametri utilizzati all'interno. Pertanto, i valori modificati all'interno della funzione non influiscono sui valori delle variabili esterne.

int func(int f, int b) { 
  //new variables are created and values from the outside copied
  //f has a value of 0
  //inner_b has a value of 1
  f = 1;
  //f has a value of 1
  b = 2;
  //inner_b has a value of 2
  return f+b;
}

int main(void) {
  int a = 0;
  int b = 1; //outer_b
  int c;

  c = func(a,b);
  //the return value is copied to c
  
  //a has a value of 0
  //outer_b has a value of 1   <--- outer_b and inner_b are different variables
  //c has a value of 3
}

In questo codice creiamo le variabili all'interno della funzione principale. Questi vengono assegnati valori. Dopo aver chiamato le funzioni, vengono create due nuove variabili: f e inner_b dove b condivide il nome con la variabile esterna e non condivide la posizione di memoria. Il comportamento di a<->f e b<->b è identico.

Il seguente grafico simboleggia cosa sta accadendo nello stack e perché non ci sono cambiamenti in varibale b . Il grafico non è completamente preciso ma enfatizza l'esempio. Visualizzazione dello stack durante la chiamata di funzione

Si chiama "call by value" perché non si consegnano le variabili ma solo i valori di queste variabili.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow