Изменение значений скалярных параметров в функциях
Использование значений параметров по умолчанию
Параметры в определении функции могут иметь, так называемые, умалчиваемые значения. Если параметр имеет умалчиваемое значение, то при вызове функции он может отсутствовать, в этом случае при выполнении тела функции вместо формального параметра используется его умалчиваемое значение.
Основные правила при использовании значений параметров по умолчанию:
- если в определении функции параметр имеет умалчиваемое значение, то все параметры, которые следуют за ним, должны иметь умалчиваемые значения;
- если при вызове параметр с умалчиваемым значением отсутствует, то все параметры, которые следуют за ним, должны также отсутствовать.
Пример функции:
int summa(int a, int b=10, int c=5) // Параметры b и c имеют умалчиваемые значения
{
return a+b+c;
}
Примеры вызовов этой функции:
int i=2, j=5, s1, s2, s3;
s1=summa(i, 2, j); // Все параметры присутствуют s1=2+2+5=9
s2=summa(i, j); // Параметр с отсутствует s2=2+5+5=12
s3=summa(i); // Параметры b и c отсутствуют s3=2+10+5=17
Рассмотрим пример, когда функция пытается изменить значение своего параметра.
void MyFun(int a)
{
a=100;
}
void main()
{
int a=10;
MyFun(a);
printf("a=%d", a); // Будет напечатано a=10
}
В данном примере, несмотря на то, что функция меняет значение параметра, на печать будет выведено старое значение фактического параметра – переменной a, т.е. изменение, которое произвела функция с параметром, после выхода из функции не сохраняется. Это происходит потому, что при передаче параметров в функцию создаются копии параметров в стеке (также все локальные переменные функции размещаются в стеке), и функция работает не с исходной переменной, а с копией этой переменной в стеке. При выходе из функции место в стеке, где размещены параметры функции и ее локальные переменные, освобождается и все изменения пропадают. Данный процесс демонстрирует рисунок, представленный ниже.
Оперативная память
…..
…..
…..
Стек
Переменная a=10
Копия a=100
Примечание. Стек(англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»). В оперативной памяти выделяется специальный сегмент стека для временного хранения данных, который работает по такому же принципу.
На рисунке показано, что исходная переменная a может размещаться как в стеке – в данном примере, так оно и есть, так как переменная a локальная переменная функции main, так и за пределами стека, если бы a была бы глобальной переменной, в данном случае это не имеет значение, так как все равно функция работает с копией a.
Такой механизм передачи параметров в функцию называется передача параметров по значению (в стек копируется значение параметра).