Лекция 8: Функции
"Чтобы что-то шло тебе в руки, нужно эти руки протянуть. Иначе протянешь ноги."
— Стив Бушеми
Что такое функция?
Функция в языке C представляет собой именованную последовательность операторов, которая может принимать параметры и возвращать значение. Подпрограммы используются для:
- Уменьшения размера памяти, занимаемой кодом;
- Разбиения крупных программ на части в соответствии с модульным принципом;
- Удобства сопровождения, оптимизации и расширения функциональности.
В языке C подпрограммы реализованы в виде функций. Отличие процедур от функций в том, что функции возвращают значение.
Функции:
- Выделяют дублирующийся код в отдельные блоки;
- Логически разделяют программу на части;
- Упрощают управление и тестирование.
Пример функции для сложения двух чисел:
#include <stdio.h>
int sum(int a, int b) {
return a + b;
}
int main() {
int result = sum(3, 4);
printf("Сумма: %d\n", result);
return 0;
}
Структура функции в C
Функция состоит из:
-
Заголовка:
- Указывает тип возвращаемого значения, имя функции и параметры.
-
Тела функции:
- Набор инструкций, выполняемых при вызове функции.
Пример:
int add(int a, int b) {
return a + b;
}
Функции бывают:
- С фиксированным или переменным числом аргументов;
- Возвращающие значение или нет (void).
Передача параметров в функцию
По значению
При вызове функции параметры передаются по значению:
#include <stdio.h>
void changeValue(int x) {
x = 100;
}
int main() {
int a = 5;
changeValue(a);
printf("Значение a: %d\n", a);
return 0;
}
Чтобы изменить оригинальную переменную, используется передача по указателю:
#include <stdio.h>
void changeValue(int *x) {
*x = 100;
}
int main() {
int a = 5;
changeValue(&a);
printf("Значение a: %d\n", a);
return 0;
}
Передача массивов и указателей
Для передачи массива передаётся его имя, интерпретируемое как указатель на первый элемент:
#include <stdio.h>
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int data[] = {1, 2, 3, 4};
printArray(data, sizeof(data) / sizeof(data[0]));
return 0;
}
Функции с переменным числом параметров
Функции с переменным числом параметров реализуются с помощью <stdarg.h>
:
#include <stdarg.h>
#include <stdio.h>
int sum(int count, ...) {
va_list args;
va_start(args, count);
int total = 0;
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
va_end(args);
return total;
}
int main() {
printf("Сумма: %d\n", sum(4, 1, 2, 3, 4));
return 0;
}
Рекурсия
Рекурсивная функция вызывает саму себя. Это удобно для задач, разбиваемых на подзадачи. Пример вычисления факториала:
#include <stdio.h>
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
int main() {
printf("Факториал 5: %d\n", factorial(5));
return 0;
}
Особенности рекурсии
- Занимает память в стеке.
- Затраты на выполнение выше, чем у итеративных алгоритмов.
- Программы с рекурсией более читаемы, но могут приводить к переполнению стека.
Встраиваемые функции
Inline-функции заменяют вызов на её тело для повышения производительности:
#include <stdio.h>
inline int square(int x) {
return x * x;
}
int main() {
printf("Квадрат числа 5: %d\n", square(5));
return 0;
}
Компилятор может отказаться от встраивания, если это ухудшает производительность.
Параметры командной строки
Функция main
может принимать параметры командной строки:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Ошибка: нужно два числа\n");
return 1;
}
int a = atoi(argv[1]);
int b = atoi(argv[2]);
printf("Сумма: %d\n", a + b);
return 0;
}
Заключение
Использование функций в C позволяет структурировать код, уменьшить дублирование и улучшить сопровождение программ. Главное – это правильно организовать взаимодействие функций между собой и с основной программой.