русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Общие сведения


Дата добавления: 2014-11-27; просмотров: 461; Нарушение авторских прав


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

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

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

# include <stdio.h>

# include <string.h>

 

void check (char a, char b, int (*cmp) (const char *, const char *));

 

int main (void)

{

char s1[80], s2[80];

int (*p) (const char*, const char*); /* объявление указателя на функцию */

p = strcmp; /* получение адреса функции strcmp */

gets(s1);

gets(s2);

check(s1, s2, p);

return 0;

}

 

void check (char a, char b, int (*cmp) (const char *, const char *))

{

printf(“Сравнение строк.\n”);

if (! (*cmp) (a,b)) printf(“Равны”);

else printf(“Не равны”);

}

Когда вызывается функция check (), ей передаются два указателя на символы и один указатель на функцию. В функции check () аргументы объявляются как указатели на символы и указатель на функцию. Следует обратить внимание на способ объявления указателя на функцию. Следует использовать аналогичный метод при объявлении других указателей на функцию, за исключением тех случаев, когда отличается возвращаемый тип или передаваемые параметры. Скобки вокруг *cmp необходимы для правильной интерпретации компилятором данного выражения.

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



Рассмотрим работу функции strcmp () и функции check (). Оператор

if (! (*cmp) (a,b)) printf(“Равны”);

осуществляет вызов функции, в данном случае strcmp (), с помощью cmp, который указывает на данную функцию. Вызов происходит с аргументами a и b. Данный оператор демонстрирует общий ввод использования указателя на функцию для вызова функции, на которую он указывает. Круглые скобки вокруг *cmp необходимы вследствие наличия приоритетов.

На самом деле можно напрямую использовать cmp, как показано ниже:

if (! cmp (a,b)) printf(“Равны”);

Данная версия также вызывает функцию, на которую указывает cmp, но она использует нормальный синтаксис. Использование (*cmp) помогает всем, читающим программу, понять, что указатель на функцию используется для вызова функции вместо функции вместо вызова функции cmp.

Возможно вызвать напрямую функцию check (), используя strcmp, как показано ниже:

check (s1, s2, strcmp);

Данный оператор устраняет необходимость наличия дополнительной переменной-указателя.

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

 



<== предыдущая лекция | следующая лекция ==>
Методические указания | Метод средних прямоугольников


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.