Zoeken…


Invoering

Het doel van deze sectie is om de verschillen in theorie en implementatie te verklaren voor wat er gebeurt met de parameters van een functie bij het aanroepen.

In detail kunnen de parameters worden gezien als variabelen vóór de functieaanroep en binnen de functie, waarbij het zichtbare gedrag en de toegankelijkheid tot deze variabelen verschilt met de methode die wordt gebruikt om ze over te dragen.

Bovendien wordt dit onderwerp ook uitgelegd hoe herbruikbaar is aan variabelen en hun respectieve waarden na de functieaanroep.

Oproep op waarde

Bij het aanroepen van een functie zijn er nieuwe elementen aangemaakt op de programmastack. Deze bevatten enige informatie over de functie en ook ruimte (geheugenlocaties) voor de parameters en de retourwaarde.

Bij het overhandigen van een parameter aan een functie wordt de waarde van de gebruikte variabele (of letterlijk) gekopieerd naar de geheugenlocatie van de functieparameter. Dit houdt in dat er nu twee geheugenlocaties zijn met dezelfde waarde. Binnen de functie werken we alleen aan de locatie van het parametergeheugen.

Na het verlaten van de functie wordt het geheugen op de programmastack geopend (verwijderd) waardoor alle gegevens van de functieaanroep worden gewist, inclusief de geheugenlocatie van de parameters die we binnen hebben gebruikt. De waarden die binnen de functie zijn gewijzigd, hebben dus geen invloed op de waarden van de externe variabelen.

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 deze code maken we variabelen binnen de hoofdfunctie. Deze krijgen toegewezen waarden. Bij het aanroepen van de functies zijn er twee nieuwe variabelen gemaakt: f en inner_b waarbij b de naam deelt met de buitenste variabele, deelt deze de geheugenlocatie niet. Het gedrag van a<->f en b<->b is identiek.

De volgende afbeelding symboliseert wat er op de stapel gebeurt en waarom er geen verandering is in varibale b . De afbeelding is niet volledig nauwkeurig, maar benadrukt het voorbeeld. Visualisatie van Stack tijdens functieaanroep

Het wordt "call by value" genoemd omdat we niet de variabelen overhandigen, maar alleen de waarden van deze variabelen.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow