Ответ 1
int (*func)();
Это объявление указателя функции. Указатель функции по существу является переменной, которая содержит адрес функции. В этом случае тип функции, на которую указывает func
, является тем, который не принимает аргументов и возвращает int
. Вы можете назначить адрес функции этой переменной следующим образом:
func = foo;
Где foo
- это функция с прототипом int foo();
.
Как только функция была назначена этой переменной, вы можете вызвать функцию, которая func
указывает на так:
(*func)();
Существует альтернативный синтаксис (который эквивалентен), который я считаю более понятным:
func();
Итак, если foo
было присвоено func
, то оба примера выше на самом деле вызывали бы функцию foo
.
Вы также можете присвоить значения указателям на функции. В примере кода
(int (*)())
- это преобразование в указатель функции, который не принимает аргументов и возвращает int
. Это значит, что компилятор не будет жаловаться на назначение указателя функции func
по существу char*
.
В коде, который вы указали выше, есть одна последняя вещь. После вызова func
результат (по какой-либо причине) передается в int
. Насколько я могу судить, этот актер совершенно не нужен. Таким образом, последняя строка
(int)(*func)();
можно заменить на
(*func)();