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

Указатели на функции

Рассмотрим теперь вопрос о том, почему в языке С функция введена как один из производных типов. Необходимость в таком типе связана, например, с задачами, в которых функция (или ее адрес) должна выступать в качестве параметра другой функции или в качестве значения, возвращаемого другой функцией. В этом случае используется «указатель на функцию».

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

«Указатель на функцию» (как переменная) вводится отдельно от определения и прототипа какой-либо функции. Для этих целей используется конструкция:

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

где <тип> - определяет тип возвращаемого функцией значения;

<имя_указателя> - идентификатор, произвольно выбранный программистом;

<спецификация_параметров> - определяет состав и типы параметров функции.

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

Массивы указателей на функции

Указатели-переменные могут группироваться в массивы, при этом используется следующая форма их определения:

<тип> (*<имя_массива>[<размер>])(<спецификация_параметров>);

где <тип> - определяет тип возвращаемых функциями значений;

<имя_массива> - идентификатор, произвольно выбранный программистом;

<размер> - количество элементов в массиве;

<спецификация_параметров> - определяет состав и типы параметров функций.

Пример:

int (*farray[4]) (int);

где farray - массив из 4-x указателей на функции, каждому из которых можно присвоить адрес функции с прототипом <int имя_функции (int)>.

Главная функция. Передача аргументов главной функции

Главная функцияэто функция, которая имеет имя main. Главная функция обязательна в любом выполняемом комплексе функций и всегда только одна. Она получает управление от операционной системы, а после выполнения передает управление. Функция main в общем случае имеет следующее определение:

void main( int argc, char *argv[])

В переменную argc передается число аргументов, размещенных в строке «Programm arguments» раздела Project Settings плюс один дополнительный аргумент, который среда Microsoft Visual C++ генерирует автоматически, и представляет собой символьную строку, содержащую путь доступа к исполняемой программе, т.е. строку вида "D:\Prog\dd\Debug\dd.exe".

Переменная *argv[] является указателем на массив указателей, в котором каждый элемент представляет собой адрес символьной строки, передаваемой из командной строки в качестве аргумента. Первым адресом в этом массиве будет адрес дополнительного аргумента, который генерируется автоматически.

Рекурсивные программы

Рекурсивной называют функцию, которая прямо или косвенно вызывает сама себя. Классический пример – это функция, вычисляющая факториал n! = 1*2*…*n, 0!=1.

long Factorial(int n)

{

if (n < 0 ) return 0; // не определен – возврат нуля

if (n == 0 ) return 1;

return(n* Factorial(n - 1));

}

Следует обратить внимание, что последовательность рекурсивных обращений к функции Factorial прерывается при вызове Factorial(0).

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

A() { … B(); …}

B() { … A(); …}