Передача параметров
Функция может принимать параметры. Параметры перечисляются в скобках после имени функции имеют следующее определение:
1
тип название_параметра
Например, определим функцию вычисления факториала:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
void factorial(int n)
{
int result = 1;
for(int i=1;i<=n;i++)
{
result *= i;
}
printf("factorial of %d is equal %d \n", n, result);
}
int main(void)
{
factorial(4);
factorial(6);
return 0;
}
Функция factorial принимает один параметр, который имеет имя n и тип int.
В методе main эта функция вызывается два раза, и каждый раз ей передается новое значение для параметра n. Передаваемое значение для параметра еще называется аргументом. В итоге функция консоль факториалы чисел 4 и 6:
factorial of 4 is equal 24
factorial of 6 is equal 720
Прототип функции factorial выглядел бы следующим образом:
1
void factorial(int n);
Если необходимо несколько параметров, то они перечисляются через запятую. Например, напишем программу имитирующую обмен валюты:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
void exchange(double currate, double sum)
{
double result = sum / currate;
printf("result=%.2f \n", result);
}
int main(void)
{
double rate;
double sum;
// ввод обменного курса иностранной валюты
printf("Currency rate:");
scanf("%lf", &rate);
// ввод суммы в текущей валюте
printf("Sum:");
scanf("%lf", &sum);
// обмен - передача значений переменных
exchange(rate, sum);
// обмен - передача числовых констант
exchange(56.87, 2000);
return 0;
}
С помощью функции scanf() осуществляется ввод с консоли для переменных rate и sum, затем эти переменные в качестве аргументов передаются в функцию exchange. Переменные, используемые в качестве аргументов, необязательно должны называться именно так, как параметры функции. Соответствие между аргументами и параметрами устанавливается по их расположению: первый аргумент передает значение для первого параметра, второй аргумент - для второго параметра и так далее. И кроме того, здесь второй вызов функции exchange в качестве аргументов получает числовые константы.
Консольный вывод программы:
Currency rate:56
Sum:56000
result=1000.00
result=35.17
Между передаваемыми в функцию аргументами и ее параметрами должно быть соответствие по типу. Если же типы не совпадают, то компилятор пытается автоматически выполнить преобразование типов.
Например, выше использовалась функция void factorial(int n). Если мы передадим в factorial значения другого типа, то компилятор будет пытаться привести их к типу int:
1
2
3
factorial(4.56);
double f = 0.53e+1;
factorial(f);
Фактически это будет аналогично следующему коду:
1
2
3
factorial((int)4.56);
double f = 0.53e+1;
factorial((int)f);
Процесс передачи параметров
При передаче параметров следует учитывать, то они передаются в функцию по значению. То есть функция не изменяет значения передаваемых аргументов. Рассмотрим следующий пример:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
void add(int a, int b, int c)
{
a = a + c;
b = b + c;
printf("Add function: a=%d \t b=%d \n", a, b);
}
int main(void)
{
int a = 20, b = 14;
printf("Main function before add: a=%d \t b=%d \n", a, b);
add(a, b, 30);
printf("Main function after add: a=%d \t b=%d \n", a, b);
return 0;
}
В функцию add передаются три числа, где к первому и ко второму число последовательно прибавляется третье. В функции main выводим перед и после выполнения функции add значения переменных a и b, которые передаются в add в качестве аргументов.
И при выполнении мы увидим, что изменения аргументов в функции add действуют только в рамках этой функции. Вне ее значения переменных a и b остаются неизменными:
Main function before add: a=20 b=14
Add function: a=50 b=44
Main function after add: a=20 b=14
Почему так происходит? При компиляции функции для ее параметров выделяются отдельные участки памяти. При этом для параметров типа float формируются в памяти объекты типа double, а для параметров типов char и short int - объекты типа int.
При вызове функции вычисляются значения аргументов, которые передаются на место параметров. И затем значения аргументов заносятся в участки памяти, отведенные для параметров. При этом значения типа float преобразуются в объекты типа double, а объекты типов char и short int - в объекты типа int.
После завершения работы функции память, выделенная для параметров, освобождается.