Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

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

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

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

Например, запись

int (*p)(void);

определяет указатель-переменную на функции без параметров, возвращаюшие значения типа int.

Запись указателя в скобках существенна, т.к. если записать:

int *p(void); то это будет не определение указателя, а прототип функции без параметров с именем р, возвращающей значение типа int *.

 

Пусть имеется некоторая функция:

void ShowString(char *s)

{

printf (“%s”,s);

}

/***********************************************

** Главная функция:

int main(void) {

void (*pFunc)(char*); // Объявление указателя на функцию.

pFunc = ShowString; // Инициализация указателя адресом функции.

(*pFunc)("Calling a pointer to function!\n");

return 0;

}

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

pFunc("Calling a pointer to function!\n");

Соотношение между указателями и функциями примерно такое же, как между указателями и массивами.

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

Такие массивы по смыслу не отличаются от массивов других объектов. Объявление:

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

Пример:

int (*p[4]) (char); - здесь p – это массив указателей на функции, каждому их которых можно присвоить адрес любой функции с прототипом вида int имя_функции(char);.

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

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

void act0 (char *name)

{

printf(“%s: Работа завершена!\n”,name);

exit(0);

}

void act1 (char *name)

{

printf(“%s: работа 1!\n”,name);

}

void act2 (char *name)

{

printf(“%s: работа 2!\n”,name);

}

void main()

{

void (*p[])(char *)={act0, act1, act2};

char s[12];

int number;

printf(“\n Введите имя пользователя:”);

scanf(“%s”,s);

printf(“\nВведите номер работы”)

while(1)

{ scanf(“%d”,&number);

p[number] (s);

}}


<== предыдущая лекция | следующая лекция ==>
Массивы и указатели | Строки
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 303; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




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