Sök…


Introduktion

Räckvidden för detta avsnitt är att förklara skillnaderna i teori och implementering för vad som händer med parametrarna för en funktion vid samtal.

I detalj kan parametrarna ses som variabler innan funktionssamtalet och inuti funktionen, där det synliga beteendet och tillgängligheten till dessa variabler skiljer sig från metoden som används för att överlämna dem.

Dessutom förklaras återanvändbarheten för variabler och deras respektive värden efter funktionssamtalet av detta ämne.

Ring efter värde

När du ringer en funktion finns det nya element skapade i programstacken. Dessa inkluderar viss information om funktionen och även utrymme (minnesplatser) för parametrarna och returvärdet.

Vid överlämnande av en parameter till en funktion kopieras värdet på den använda variabeln (eller bokstavligen) till minnesplatsen för funktionsparametern. Detta innebär att det nu finns två minnesplatser med samma värde. Inuti funktionen arbetar vi bara med parameterminnet.

Efter att ha lämnat funktionen poppas (tas bort minnet på programstacken) vilket raderar all data från funktionssamtalet, inklusive minnesplatsen för parametrarna vi använde inuti. Således påverkar inte värdena som ändras i funktionen de utvändiga variablernas värden.

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
}

I den här koden skapar vi variabler i huvudfunktionen. Dessa får tilldelade värden. När funktionen kallas finns det två nya variabler som skapas: f och inner_b där b delar namnet med den yttre variabeln som den inte delar minnesplatsen. Beteendet hos a<->f och b<->b är identiskt.

Följande grafik symboliserar vad som händer på bunten och varför det inte sker någon förändring i varibalen b . Grafiken är inte helt exakt men exemplifierar exemplet. Visualisering av Stack under funktionssamtal

Det kallas "call by value" eftersom vi inte överlämnar variablerna utan bara värdena på dessa variabler.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow