... они сохраняют свои значения даже после того, как функции, которые их устанавливают, возвращаются.
Я предполагаю, что это вопрос интерпретации с вашей стороны.
Учитывая, что переменная является глобальной, при каждом ее изменении в любой функции она будет принимать и сохранять это значение до следующего изменения.
Взять функцию:
int i = 0;
void foo();
int main()
{
int x = 0;
foo(x);
printf("%d", i);
printf("%d", x);
return 0;
}
void foo(int x)
{
x = 1;
i = 1;
}
результат: x = 0
i = 1
x
передается по значению, по сути, его копии, поэтому, как только функция выходит из области видимости, т.е. возвращается, копия отбрасывается. i
является глобальным, поэтому вам даже не нужно его передавать; каждая функция осознает свое существование и изменит свое значение.