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

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

Можно объявить массив указателей на функции. Например:

int (*testCases[10])();

testCases – это массив из десяти элементов, каждый из которых является указателем на функцию, возвращающую значение типа int и не имеющую параметров.

Подобные объявления трудно читать, поскольку не сразу видно, с какой частью ассоциируется тип функции.

В этом случае помогает использование имен, определенных с помощью директивы typedef:

// typedef делает объявление более понятным

typedef int (*PFV)(); // typedef для указателя на функцию

PFV testCases[10];

Данное объявление эквивалентно предыдущему.

Вызов функций, адресуемых элементами массива testCases, выглядит следующим образом:

const int size = 10;

PFV testCases[size];

int testResults[size];

void runtests() {

for ( int i = 0; i

Массив указателей на функции может быть инициализирован списком, каждый элемент

которого является функцией. Например:

int lexicoCompare( const string , const string );

int sizeCompare( const string , const string );

typedef int ( *PFI2S )( const string , const string );

PFI2S compareFuncs[2] =

{

lexicoCompare,

sizeCompare

};

Можно объявить и указатель на compareFuncs, его типом будет “указатель на массив указателей на функции”:

PFI2S (*pfCompare)[2] = compareFuncs;

Это объявление раскладывается на составные части следующим образом:

(*pfCompare)

Оператор разыменования говорит, что pfCompare является указателем. [2] сообщает о количестве элементов массива:

(*pfCompare) [2]

PFI2S – имя, определенное с помощью директивы typedef, называет тип элементов. Это “указатель на функцию, возвращающую int и имеющую два параметра типа const string ”. Тип элемента массива тот же, что и выражения lexicoCompare.

Такой тип имеет и первый элемент массива compareFuncs, который может быть получен с помощью любого из выражений:

compareFunc[ 0 ];

(*pfCompare)[ 0 ];

Чтобы вызвать функцию lexicoCompare через pfCompare, нужно написать одну из следующих инструкций:

// эквивалентные вызовы

pfCompare [ 0 ]( string1, string2 ); // сокращенная форма

((*pfCompare)[ 0 ])( string1, string2 ); // явная форма