Szukaj…


Wprowadzenie

Celem tego rozdziału jest wyjaśnienie różnic w teorii i implementacji tego, co dzieje się z parametrami funkcji po wywołaniu.

Szczegółowo parametry można postrzegać jako zmienne przed wywołaniem funkcji i wewnątrz funkcji, gdzie widoczne zachowanie i dostępność tych zmiennych różni się w zależności od metody użytej do ich przekazania.

Ponadto w tym temacie wyjaśniono możliwość ponownego użycia zmiennych i ich odpowiednich wartości po wywołaniu funkcji.

Zadzwoń według wartości

Po wywołaniu funkcji na stosie programu tworzone są nowe elementy. Obejmują one niektóre informacje o funkcji, a także przestrzeń (lokalizacje pamięci) dla parametrów i zwracaną wartość.

Podczas przekazywania parametru do funkcji wartość użytej zmiennej (lub literału) jest kopiowana do miejsca w pamięci parametru funkcji. Oznacza to, że teraz istnieją dwie lokalizacje pamięci o tej samej wartości. Wewnątrz funkcji pracujemy tylko nad lokalizacją pamięci parametrów.

Po wyjściu z funkcji pamięć na stosie programu jest usuwana (usuwana), co kasuje wszystkie dane wywołania funkcji, w tym miejsce w pamięci parametrów, które zastosowaliśmy w środku. Zatem wartości zmienione wewnątrz funkcji nie wpływają na wartości zmiennych zewnętrznych.

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
}

W tym kodzie tworzymy zmienne wewnątrz funkcji głównej. Otrzymują one przypisane wartości. Po wywołaniu funkcji powstają dwie nowe zmienne: f i inner_b gdzie b dzieli nazwę ze zmienną zewnętrzną, nie dzieli lokalizacji pamięci. Zachowanie a<->f b<->b jest identyczne.

Poniższa grafika symbolizuje to, co dzieje się na stosie i dlaczego nie zmieniono varibale b . Grafika nie jest w pełni dokładna, ale podkreśla przykład. Wizualizacja stosu podczas wywołania funkcji

Nazywa się to „call by value”, ponieważ nie przekazujemy zmiennych, a jedynie wartości tych zmiennych.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow