Recherche…


Introduction

Le but de cette section est d'expliquer les différences de théorie et de mise en œuvre pour ce qui se passe avec les paramètres d'une fonction lors de l'appel.

En détail, les paramètres peuvent être considérés comme des variables avant l'appel de la fonction et à l'intérieur de la fonction, où le comportement visible et l'accessibilité à ces variables diffèrent de la méthode utilisée pour les transmettre.

En outre, cette rubrique explique également la réutilisation des variables et leurs valeurs respectives après l'appel de la fonction.

Appel par valeur

Lors de l'appel d'une fonction, de nouveaux éléments sont créés sur la pile du programme. Celles-ci incluent des informations sur la fonction et l'espace (emplacements de mémoire) pour les paramètres et la valeur de retour.

Lors de la transmission d'un paramètre à une fonction, la valeur de la variable utilisée (ou littérale) est copiée dans l'emplacement mémoire du paramètre de fonction. Cela implique que maintenant il y a deux emplacements de mémoire avec la même valeur. À l'intérieur de la fonction, nous travaillons uniquement sur l'emplacement de la mémoire de paramètres.

Après avoir quitté la fonction, la mémoire de la pile de programmes est supprimée (supprimée), ce qui efface toutes les données de l'appel de fonction, y compris l'emplacement mémoire des paramètres utilisés à l'intérieur. Ainsi, les valeurs modifiées dans la fonction n’affectent pas les valeurs des variables externes.

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
}

Dans ce code, nous créons des variables dans la fonction principale. Ceux-ci reçoivent des valeurs assignées. Lors de l'appel des fonctions, deux nouvelles variables ont été créées: f et inner_bb partage le nom avec la variable externe dont il ne partage pas l'emplacement mémoire. Le comportement d' a<->f et b<->b est identique.

Le graphique suivant symbolise ce qui se passe sur la pile et pourquoi il n'y a pas de changement dans varibale b . Le graphique n'est pas tout à fait exact mais souligne l'exemple. Visualisation de la pile lors d'un appel de fonction

On l'appelle "call by value" car on ne remet pas les variables mais seulement les valeurs de ces variables.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow