ВУЗ:
Составители:
Рубрика:
тип имя_функции(список формальных параметров)
тело_функции
В качестве типа функции может выступать любой тип данных, в том числе и void, если функция не возвращает резуль-
тат явно. Список формальных параметров может быть пустым, вместо него может стоять void, либо здесь перечисляются
формальные параметры с описанием их типов данных. Список параметров переменной длины должен заканчиваться много-
точием. Тело функции представляет собой ограниченный фигурными скобками блок, идущий сразу за заголовком функции.
Внутри блока размещаются определения необходимых функции программных объектов и операторы. Последним (иногда
необязательным) оператором является оператор возврата из функции return (return; или return выражение;). Возвращаемое
выражение должно иметь тот же тип данных, что и тип функции, либо тип, допускающий автоматическое преобразование к
типу возвращаемого функцией результата.
Для того, чтобы компилятор смог проверить правильность обращения к функции в программе (правильное указание ее
имени и соответствие типов передаваемых данных и результата), он должен иметь представление о функции. Поэтому до
первого обращения к функции должно быть размещено или определение функции, или ее описание (прототип функции).
Фактически прототип является заголовком функции с той разницей, что в нем могут отсутствовать имена передаваемых объ-
ектов в списке формальных параметров:
тип имя_функции(спецификация параметров);
Для обращения к функции используется выражение с использованием операции "круглые скобки":
имя_функции(список фактических параметров)
В качестве имени функции может выступать указатель на нее. Список фактических параметров функции (аргументов)
представляет собой список выражений, число и тип данных которых должны совпадать с формальными параметрами функ-
ции. Соответствие между формальными и фактическими параметрами устанавливается по их взаимному расположению в
списках. Если типы данных формальных и фактических параметров не совпадают, то компилятор пытается автоматически
преобразовать тип фактических параметров, если это допустимо.
Большое внимание следует уделять правилам передачи параметров при обращениях к функциям. В языке С предусмот-
рена только передача параметров по значениям. Поэтому формальные параметры функции локализованы в ней и не доступ-
ны вне определения функции. Никакие операции над параметрами функции, а также ее внутренними переменными не влия-
ют на фактические параметры. Передача параметров по значению предполагает выполнение следующих действий:
1) при подготовке функции к выполнению выделяются участки памяти для формальных параметров. После этого
формальные параметры становятся внутренними объектами функции;
2) вычисляются значения выражений, использованных в качестве фактических параметров при вызове функций;
3) значения выражений – фактических параметров копируются в участки памяти, выделенные для формальных пара-
метров;
4) преобразование данных в теле функции выполняется с использованием внутренних объектов, а в точку вызова
функции передается только возвращаемое значение;
5) после выхода из функции память, выделенная для формальных параметров, освобождается.
Вызов функции всегда является выражением, но его использование в программе зависит от типа возвращаемого значе-
ния. Если в качестве типа возвращаемого значения указан тип void, то функция не возвращает ничего. Следовательно, ее
нельзя использовать в выражениях, а нужно вызывать в виде отдельного оператора:
имя_функции(список фактических параметров);
Помимо этого может отсутствовать и список фактических параметров, если вместо списка формальных параметров
функции использовано ключевое слово void в ее заголовке.
В случае использования только параметров-значений функция не имеет никакой возможности изменять объекты вызы-
вающей функции при выполнении своих операторов. Однако подобная необходимость появляется достаточно часто (приме-
ром может служить функция scanf). Для этого существует косвенная возможность – использование в качестве формальных
параметров функции указателей. При помощи указателя в вызываемую функцию можно передать адрес фактического объек-
та, принадлежащего вызывающей функции. Применяя операцию разыменования '*' можно получить доступ к любому объек-
ту программы.
П р и м е р 35
Определение модуля числа
#include <stdio.h>
void modul(int *i)
{*i = *i > 0 ? *i : -*i;}
void main()
{
int n;
scanf ("%d", &n); printf("%d", modul(&n));
}
Страницы
- « первая
- ‹ предыдущая
- …
- 30
- 31
- 32
- 33
- 34
- …
- следующая ›
- последняя »
