Обращение к функции имеет вид
имя_функции (список аргументов), где
список аргументов – последовательность выражений, разделенных запятыми, представляющих фактические параметры, которые должны соответствовать списку формальных параметров в количестве, порядке следования и типах параметров. При передаче параметров в функцию может выполняться дополнительное преобразование типов фактических параметров к типу формальных.
Возможны два способа вызова функции:
1. Вызов функции – операнд.
В этом случае значение, возвращаемое функцией, используется в выражении, где функция участвует как операнд; например:
int fun1(int k) /* заголовок функции */
m = fun1(n) * p; /* вызов функции-операнда */
2. Вызов функции – оператор.
Если вместо типа функции стоит слово void или возвращаемое значение функции игнорируется, а используются только фактические параметры, то вызов функции задается как отдельный оператор, например:
void fun2 (int mas[]) /* заголовок функции */
fun2 (ar[10]); /* вызов функции-оператора */
|
|
Передача параметров функции
При обработке вызова функции возможны два способа передачи данных в функцию и из функции: по значению и по адресу.
Передача данных по значению
Обрабатывая вызов функции, компилятор осуществляет запись копий значений фактических параметров (выражений, переменных или констант) в стек (временную память). Формальные параметры при выполнении тела функции работают с копиями аргументов. Таким образом, формальные и фактические параметры изолируются друг от друга, поэтому в теле функции нельзя изменить значение фактического параметра.
Пример. Составить функцию Sum, которая увеличивает свои параметры на 1 и возвращает их сумму, и использовать ее в главной функции.
Программа:
int Sum (int a, int b) /* описание функции Sum */
{ a++; b++; return (a+b); }
void main () /* главная функция */
{ int m, k=5, l=4; /* фактические параметры */
m = Sum(k, l); /* передача аргументов по значению */
printf (“m=%d k=%d l=%d “, m, k, l ”);
}
Результат программы: m=11 k=5 l=4,
то есть фактические параметры (k, l) остались без изменения после вызова функции.
Такой способ используется, если необходимо сохранить значения фактических параметров после работы вызываемой функции.