Поиск…


Вступление

Сфера применения этого раздела заключается в объяснении различий в теории и реализации того, что происходит с параметрами функции при вызове.

Подробно параметры можно рассматривать как переменные перед вызовом функции и внутри функции, где видимое поведение и доступность этих переменных различаются с методом, используемым для их передачи.

Кроме того, повторное использование переменных и их соответствующих значений после вызова функции также объясняется этой темой.

Вызов по значению

При вызове функции в стеке программы появляются новые элементы. К ним относятся некоторая информация о функции, а также о пространстве (ячейках памяти) для параметров и возвращаемом значении.

При передаче параметра функции значение используемой переменной (или литерала) копируется в ячейку памяти параметра функции. Это означает, что теперь есть две ячейки памяти с одинаковым значением. Внутри функции мы работаем только в области памяти параметров.

После выхода из функции выпадающая (удаленная) память в стеке программы удаляет все данные вызова функции, включая расположение памяти параметров, которые мы использовали внутри. Таким образом, значения, измененные внутри функции, не влияют на значения внешних переменных.

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
}

В этом коде мы создаем переменные внутри основной функции. Они получают назначенные значения. При вызове функций создаются две новые переменные: f и inner_b где b разделяет имя с внешней переменной, которая не разделяет память. Поведение a<->f и b<->b идентично.

Следующий рисунок символизирует, что происходит в стеке и почему нет изменений в varibale b . Графика не полностью точна, но подчеркивает пример. Визуализация стека во время вызова функции

Он называется «вызов по значению», потому что мы не передаем переменные, а только значения этих переменных.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow