Инструкции

Справочный раздел

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

Разделы инструкций

В сети

Пользователей: 391
Из них просматривают:
Аналоги: 160. Даташиты: 107. Инструкции: 6. Новости: 8. Остальное: 6. Производители: 1. Профиль пользователя: 74. Расчёты: 1. Теги: 1. Форум: 27.
Участников: 2
Гостей: 389

Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.
Оглавление

Косвенное обращение к функции

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

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

 

int (*funcptr)(int, int);

 

Этот пример объявляет переменную funcptr типа указатель на функцию, возвращающую результат типа int и имеющую 2 параметра типа int. При объявлении указателя на функцию запись выглядит слегка шиворот-навыворот, но так уж требует Си: сначала мы указываем тип результата функции, затем обязательно в круглых скобках идентификатор (не забудьте про звездочку - признак указателя), а затем, опять в круглых скобках, список типов параметров функции.

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

 

typedef int (*t_func)(int, int);

t_func funcptr;

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

 

funcptr = (t_func)0x1000;

funcptr(3, 12); // вызов функции с параметрами по абсолютному адресу

 
В этом примере можно было бы использовать и такое присваивание значения указателю:

 
funcptr = (void *)0x1000;

 

так как тип указателя (void *) совместим с любым иным типом указателя.

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

Разное

Интересно

Канифоль можно изготовить самому, собрав в лесу сосновую (не еловую!) смолу и перетопив ее в консервной банке.