10. Можно ли как-то сделать массив функций, чтобы вызывать нужную по индексу?
Автор ARV   
18.12.2009 г.

Да, конечно, если помнить, что идентификатор функции есть указатель! Правда, указатель этот имеет весьма непростой тип и определяется по следующему шаблону:

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

Например, пусть нужно определить указатель funcptr на функцию с тремя параметрами типа int, возвращающую результат типа char:

char (*funcptr) (int,int,int);

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

char foo(int x, int y, int z){
   return (x + y * z) >> 8;
}
funcptr = foo;
char result = funcptr(1,2,3);

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

typedef char (*funcptr_t)(int,int,int);
funcptr_t func_array[5]; // массив из 5-и указателей на наши функции

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


Добавить в любимые (0) | Просмотров: 7613

  Коментарии (3)
 1 Написал(а) Денис Громов, в 15:53 09.03.2011
Вот если бы эту статью я прочел вчера часиков в 11 вечера, я бы сэкономил два с половиной часа драгоценнейшего ночного времени. =)
 2 Написал(а) Степа, в 13:06 21.01.2015
Не могли бы Вы привести пример дальнейшего использования Func_array[i]&
 3 Написал(а) ARV, в 22:32 07.04.2016
Пример массива функций нужен? Для упомянутого в статье массива можно вызвать 3-ю функцию массива так: 
char result = func_array[3](1,2,3); 
 
а вообще для вопросов есть форум.

Только зарегистрированные пользователи могут оставлять коментарии.
Пожалуйста зарегистрируйтесь или войдите в ваш аккаунт.