Что такое "int * (* pfp) ();" делать в C? - PullRequest
3 голосов
/ 05 апреля 2010

Что это делает?

int *(*pfp) ();

Ответы [ 4 ]

7 голосов
/ 05 апреля 2010

int *(*pfp) ();

Создает указатель на функцию, которая возвращает int *. Имя указателя функции: pfp.

Вот пример:

int* myFunc(void)
{
   return NULL;
}


int main(int argc, char**argv)
{
  int *(*pfp) (void);
  pfp = myFunc;
  return 0;
}

Примечание. Поскольку параметры указателя функции не являются (void), которые вы указали, это означает, что список параметров не указан в C. В C ++ это будет означать, что это функция без точных параметров.

4 голосов
/ 05 апреля 2010

Брайан объяснил «что», но если вам интересно, почему, вот выдержка из Денниса Ритчи Развитие языка Си :

Второе новшество, которое наиболее четко отличает C от его предшественников, - это более полная структура типов и особенно ее выражение в синтаксисе объявлений. NB предложил базовые типы int и char вместе с их массивами и указателями на них, но без дальнейших способов компоновки. Требовалось обобщение: для объекта любого типа должна быть возможность описать новый объект, который объединяет несколько в массив, возвращает его из функции или является указателем на него.

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

int i, *pi, **ppi;

объявлять целое число, указатель на целое число, указатель на указатель на целое число. Синтаксис этих объявлений отражает наблюдение, что все i, * pi и ** ppi дают тип int при использовании в выражении. Аналогичным образом,

int f(), *f(), (*f)();

объявить функцию, возвращающую целое число, функцию, возвращающую указатель на целое число, указатель на функцию, возвращающую целое число;

int *api[10], (*pai)[10];

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

Для получения дополнительной информации, прочитайте « Считывание объявлений типа С * » Стива Фридла или « Чтение деклараций С С: Руководство для мистифицированных ».

0 голосов
/ 05 апреля 2010

Используйте http://www.cdecl.org/ для этих вещей, если вы не уверены.

0 голосов
/ 05 апреля 2010

pfp - указатель на функцию, которая не принимает параметров (или неопределенных параметров в C) и возвращает указатель на int.

Использование правила «спираль по часовой стрелке» - эффективный способ расшифровки сложных объявлений C (по крайней мере, я считаю его эффективным):

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...