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

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

тип (* имя) (список типов);, где

тип – спецификатор типа возвращаемого функций значения;

имя – идентификатор указателя-переменной на функцию;

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

Например, рассмотрим определение объекта fun:

int (*fun) (int);

                   
         
 
 
 
 


1) объект с этим именем есть

2) указатель

3) на функцию

4) с одним аргументом типа int

5) и возвращаемое значение типа int.

Скобки (*fun) необходимы, так как в описании скобки () связываются с именем раньше, чем символ ‘*’. Объявление вида int *fun (); означает функцию fun, возвращающую указатель на объект целого типа. Точно так же как указание имени массива без [ ] означает адрес его первого байта, указание имени функции без () задаёт адрес её начала.

Пример. Демонстрация использования указателя-переменной на функцию (funprt), которой можно присваивать ссылки на разные функции.

Программа:

#include <stdio.h>

#include <conio.h> /* для функций clrscr и getch */

int difference (int, int); /* прототипы функций */

int sum (int, int);

void main ()

{ /* int (*funptr) (int, int); указатель-переменная на функцию с 2-мя аргументами */

int (*funptr) (); /* указатель-переменная без аргументов */

int var1=2, var2=5, ret; /* рабочие переменные */

clrscr(); /* очистка экрана */

funptr = difference; /* указатель получает адрес 1-й функции */

ret = funptr(var1, var2); /* результат функции по указателю */

puts (“Результаты программы:”);

printf (“ret = %d\n”, ret); /* вывод результата */

funptr = sum; /* указатель получает адрес 2-й функции */

ret = funptr(var1, var2); /* результат функции по указателю */

printf (“ret = %d\n”, ret); /* вывод результата */

getch(); /* задержка экрана результатов */

}

int difference (int a, int b) /* описание функции вычитания */

{return (a – b);}

int sum (int a, int b) /* описание функции сложения */

{return (a+b);}

Результаты программы:

ret = –3

ret = 7


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: