мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| c:c_ultimate_guide:functions [2025/10/10 11:53] – radi0dev | c:c_ultimate_guide:functions [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 67: | Строка 67: | ||
| параметры ф-ии можно изменять((При компиляции функции для ее параметров выделяются отдельные участки памяти. Передаеться только значение)) в теле функции | параметры ф-ии можно изменять((При компиляции функции для ее параметров выделяются отдельные участки памяти. Передаеться только значение)) в теле функции | ||
| - | параметры могут иметь те же приставки, | + | параметры могут иметь те же модификаторы, |
| + | |||
| + | ==== Передача параметров ==== | ||
| + | |||
| + | Существует два основных способа передачи параметров в функции: | ||
| + | |||
| + | При **передаче по значению** значением будет копия аргумента, | ||
| + | |||
| + | <code c> | ||
| + | void modify_value(int value) { | ||
| + | value = 100; // Это изменение не затронет оригинальный аргумент | ||
| + | } | ||
| + | |||
| + | int main(void) { | ||
| + | int original = 42; | ||
| + | modify_value(original); | ||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | При **передаче по указателю** передается адрес переменной, что позволяет функции изменять | ||
| + | |||
| + | <code c> | ||
| + | void modify_value(int *value) { | ||
| + | *value = 100; // Изменяет оригинальный аргумент | ||
| + | } | ||
| + | |||
| + | int main(void) { | ||
| + | int original = 42; | ||
| + | modify_value(& | ||
| + | printf(" | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Использование указателей также позволяет | ||
| + | |||
| + | <code c> | ||
| + | void print_array(int array[], int size) { | ||
| + | for (int i = 0; i < size; i++) { | ||
| + | printf(" | ||
| + | } | ||
| + | printf(" | ||
| + | } | ||
| + | |||
| + | int main(void) { | ||
| + | int numbers[] = {1, 2, 3, 4, 5}; | ||
| + | print_array(numbers, | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Переменное количество параметров ==== | ||
| + | |||
| + | [[stdarg.h]] | ||
| ===== Возвращаемые значения ===== | ===== Возвращаемые значения ===== | ||
| Строка 109: | Строка 164: | ||
| </ | </ | ||
| + | ===== Типы функций ===== | ||
| + | |||
| + | Используя определение функции - ее возвращаемый тип и типы параметров мы можем описать тип функций. Для этого применяется оператор typedef:\\ | ||
| + | '' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | | ||
| + | typedef void (message)(void); | ||
| + | |||
| + | void hello() { printf(" | ||
| + | void goodbye() { printf(" | ||
| + | |||
| + | int main(void) { | ||
| + | message* mes1 = &hello; // указатель указывает на функцию hello | ||
| + | message* mes2 = & | ||
| + | | ||
| + | mes1(); // Hello, World | ||
| + | mes2(); // Good Bye, World | ||
| + | | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Тип функции-указатель ==== | ||
| + | |||
| + | Тип функции можно определить как указатель. Например: | ||
| + | '' | ||
| + | |||
| + | Но стоит понимать, | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | | ||
| + | typedef int (*binary_op)(int, | ||
| + | |||
| + | int sum(int x, int y) { return x + y; } | ||
| + | |||
| + | int main(void) { | ||
| + | binary_op op1 = ∑ // op1 уже изначально представляет указатель | ||
| + | printf(" | ||
| + | | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||