Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Указатели на функции. Особенности использования.

Читайте также:
  1. I. ВВЕДЕНИЕ. ПРОБЛЕМЫ И ОСОБЕННОСТИ РАЗВИТИЯ СПОРТИВНОГО ТУРИЗМА НА СОВРЕМЕННОМ ЭТАПЕ.
  2. II.3 Характерные особенности фразеологизмов
  3. III. В особенности нужно решительно помогать детям тупым и глупым от природы.
  4. IV. ОСОБЕННОСТИ ПСИХОМОТОРНОГО РАЗВИТИЯ РЕБЕНКА ДО 3Х ЛЕТ
  5. V. Повторите методические рекомендации для студентов по методике обследования пациента, учитывая возрастные особенности.
  6. V2: Особенности спроса и предложения факторов производства.
  7. А.Д.: А вы о людях можете рассказать, с которыми служили вместе с вами? Вот Белоусов, например? Какой он человек был, черты характеа какие-то особенности?

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

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

Через указатель можно войти в функцию, т.е. запустить ее на выполнение. Объявление вида:

int (*f)();

говорит о том, что f - это указатель на функцию, возвращающую целое значение. Первая пара скобок необходима, без них int *f(); означало бы, что f - функция, возвращающая указатель на целое значение. После объявления указателя на функцию в программе можно использовать объекты: *f - сама функция; f - указатель на функцию. Для любой функции ее имя (без скобок и аргументов) является указателем на эту функцию.

 

int (*p)(const char *, const char *); /* указатель на функцию */
p = strcmp; /* присваивает адрес функции strcmp указателю p */

 

Это объявление сообщает компилятору, что p — это указатель на функцию, имеющую два параметра типа const char * и возвращающую значение типа int. Скобки вокруг p необходимы для правильной интерпретации объявления компилятором. Подобная форма объявления используется также для указателей на любые другие функции, нужно лишь внести изменения в зависимости от возвращаемого типа и параметров функции.

 

void check(char *a, char *b,
int (*cmp)(const char *, const char *))
{
printf("Проверка на совпадение.\n");
if(!(*cmp)(a, b)) printf("Равны");
else printf("Не равны");
}

 

Теперь рассмотрим функцию check(). В ней объявлены три параметра: два указателя на символьный тип (a и b) и указатель на функцию cmp. Обратите внимание на то, что указатель функции cmp объявлен в том же формате, что и p. Поэтому в cmp можно хранить значение указателя на функцию, имеющую два параметра типа const char * и возвращающую значение int. Как и в объявлении p, круглые скобки вокруг *cmp необходимы для правильной интерпретации этого объявления компилятором.

Внутри check() выражение

(*cmp)(a, b)

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

cmp(a, b);

 

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

check(s1, s2, strcmp);

В этом случае вводить в программу дополнительный указатель p нет необходимости.

 

 


Дата добавления: 2015-10-13; просмотров: 95 | Нарушение авторских прав


Читайте в этой же книге: Язык программирования Си | Представление данных в памяти компьютера. | Явное преобразование типов | Простые и составные инструкции. | Динамические массивы. Особенности обработки динамических массивов. | Строки. Операции над строками. Указатели на строки. | Структурные типы данных: структуры. Особенности использования. | Основы файловой системы: файл, каталог, дисковод, полное имя файла, внутреннее представление информации в файле. Типы файлов. | Память. Классы памяти. Модификаторы классов памяти. Область видимости, время жизни и место размещения объекта в памяти. | Достоинства, отличительные особенности и сравнительная характеристика языка программирования Си. |
<== предыдущая страница | следующая страница ==>
ИНДЕКСАЦИЯ В МАССИВАХ| Классификация динамических структур данных

mybiblioteka.su - 2015-2024 год. (0.006 сек.)