Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
53
Добавлен:
11.05.2015
Размер:
547.84 Кб
Скачать

Описание функций

Для корректного обращения к функции сведения о ней должны быть известны компилятору, т.е. до вызова функции в том же файле рекомендуется помещать ее описание – прототип:

<тип> <имя_функции>(<спецификация параметров>);

В отличие от заголовка функции в ее прототипе могут не указываться имена формальных параметров, например эквивалентны

double Func(int n, double x);

double Func(int, double);

Вызов функции

Вызов функции реализуется выражением с операцией «круглые скобки». При этом используется следующий синтаксис:

<обозначение_функции> (<список фактических параметров>);

Обычно в качестве <обозначение_функции> выступает ее имя. Кроме того, функцию можно обозначить, разыменовав указатель на нее. Этот способ будет рассмотрен в дальнейшем.

<список фактических параметров>, называемых по аналогии с математикой аргументами – это список выражений, количество которых равно числу формальных параметров функции (исключение составляют функции с переменным количеством параметров). Соответствие между формальными и фактическими параметрами устанавливается по их взаимному расположению в списках.

Между формальными и фактическими параметрами должно быть соответствие по типам. Если типы не совпадают – включается механизм преобразования типов (если проведение такого преобразования допустимо).

Передача параметров

Синтаксис языка С предусматривает только один способ передачи параметров – передачу по значениям. Это означает, что формальные параметры функции локализованы в ней и не доступны вне ее определения, никакие операции над формальными параметрами в теле функции не изменяют значений фактических параметров.

Передача параметров по значению предусматривает следующие шаги:

1. При вызове функции выделяются участки памяти для ее формальных параметров. Если параметром является массив, то формируется указатель на начало этого массива и он служит представлением массива-параметра в теле функции.

2. Вычисляются значения выражений, использованных в качестве фактических параметров при вызове функции.

3. Вычисленные значения заносятся в участки памяти, выделенные для формальных параметров функции.

4. В теле функции выполняется обработка с использованием значений внутренних объектов-параметров, и результат передается в точку вызова функции как возвращаемое ею значение.

5. После выхода из функции освобождается память, выделенная для ее формальных параметров.

Стек

Область, в которой выделяется память для размещения формальных параметров функции, называется стеком.

Наряду с фрагментом, соответствующим формальным параметрам стартуемой функции, в стек заносится и адрес точки возврата.

Объект вызывающей программы, использованный в качестве фактического параметра, не может быть изменен из тела функции. Однако существует косвенная возможность изменять значения объектов вызывающей программы действиями в вызванной функции. Эту возможность обеспечивает аппарат указателей. С помощью указателя в вызываемую функцию можно передать адрес любого объекта из вызывающей программы. С помощью выполняемого в вызываемой функции разыменования указателя мы получаем доступ к адресуемому этим указателем объекту из вызывающей программы.

Тем самым, не изменяя самого параметра (указатель-параметр постоянно содержит только адрес одного и того же объекта), можно изменять объект вызывающей программы.