В C аргументы функции действуют как локальные переменные внутри функции.Далее C использует вызов по значению, что означает, что значение переменной, используемой вызывающей стороной в качестве аргумента, равно , скопировано в переменную аргумента функции.Следовательно, две переменные являются полностью независимыми переменными.
Рассмотрим этот код:
void foo(int x)
{
x++;
printf("%d", x);
}
void bar(int y)
{
y++;
printf("%d ", y);
foo(y);
printf("%d", y);
}
bar(0);
Это выведет "1 2 1"
Большинство людей считают, что изменения очевидныx
не изменится y
.Они по имени две разные переменные.Так что в этом нет ничего удивительного.
Если мы изменим код, чтобы использовать одно и то же имя для переменных - как:
void foo(int x)
{
x++;
printf("%d", x);
}
void bar(int x)
{
x++;
printf("%d ", x);
foo(x);
printf("%d", x);
}
bar(0);
Вывод все еще "1 2 1"
Просто потому, что переменная x
внутри foo
является другой переменной, чем x
внутри bar
.Единственное отношение, которое у них есть, это то, что x
внутри foo
инициализируется с копией значения x
внутри bar
.Независимо от того, какое изменение вы вносите в x
внутри foo
, оно не может / не может измениться x
внутри bar
.
Точно то же самое относится и к рекурсии.Каждый вызов функции создает свою собственную переменную n
- полностью независимую от переменной n
в предыдущих вызовах.
В большинстве реализаций для реализации этой функции используется стек.Выполните поиск «стека кадра», чтобы получить больше информации.Также см. Объясните концепцию стекового фрейма в двух словах