Если переменные и константы хранят состояние программы, то функции определяют ее действия. Функцию можно представить, как именованный кусок кода, который можно многократно использовать в различных частях программы.
Определение функции
Формальное определение функции выглядит следующим образом:
тип <имя функции>(параметры)
{
выполняемые инструкции
}
Первая строка представляет заголовок или сигнатуру функции. Первым указывается тип данных, которые возвращает функция. Если функция ни чего не возвращает, то используется тип void. Затем идет имя функции, к которому применяются те же правила, что и к именованию переменных. После имени функции в круглых скобках перечисляются параметры. Функция может не иметь параметров, в этом случае указывается тип void или оставляют пустые скобки. После заголовка функции в фигурных скобках идет тело функции, которое содержит выполняемые выражения.
На предыдущих занятиях уже многократно использовались различные функции, например, для вывода строки на консоль применялась функция printf().
ВАЖНО !!!, каждая программа на языке Си должна содержать главную функцию с фиксированным именем main(), являющуюся точкой входа.
Для примера, определим свою функцию:
#include <stdio.h>
void
hello()
{
printf
(
"Hello!\n"
);
}
int
main(
void
)
{
return
0;
}
В данном коде, кроме стандартной функции main(), определена функция hello(), которая не имеет параметров и ничего не возвращает. Она просто выводит на консоль строку "Hello!". Если запустить этот код, то никаких строк на консоль не будет выведено, так как функция hello() не выполняется. Что бы ее запустить необходимо ее вызвать, указав название и параметры:
имя_функции(аргументы);
Изменим код, что бы на конслоли выводилось нужно сообщение из функции:
#include <stdio.h>
void
hello()
{
printf
(
"Hello!\n"
);
}
int
main(
void
)
{
hello();
// вызов функции
return
0;
}
Прототип или описание функции
При написании функции следует знать важный момент - компилятор должен узнать о функции до ее вызова. Сообщить компилятор о существовании функции можно двумя способами:
- Первый - определять функцию до ее использования, как это было сделано в коде выше.
- Второй - использовать прототип функции, до ее использования, а определение производить в любом другом месте.
Прототипом функции фактически является ее заголовок:
тип имя_функции(параметры);
Пример кода с прототипом:
#include <stdio.h>
// прототип
void
hello(
void
);
int
main(
void
)
{
hello();
return
0;
}
// определение
void
hello()
{
printf
(
"Hello!\n"
);
}
ВАЖНО !!! Параметры в Си передаются ТОЛЬКО по значению, то есть в отдельные области памяти, соответствующие формальным параметрам, копируются значения переменных или выражений, являющихся фактическими параметрами, и функция не влияет на эти параметры (функция не может изменять их значения). Для того, чтобы менять значения объектов, передаваемых в качестве параметров, необходимо использовать указатели. Это будет рассмотрено на следующих занятиях.
Комментарии ()