2010-04-05 3 views

ответ

7

int *(*pfp)();

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

Вот пример:

int* myFunc(void) 
{ 
    return NULL; 
} 


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

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

+0

И параметры функции также не указаны. (Если у него не было параметров, это будет 'int * (* pfp) (void); вместо этого.) –

0

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

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

4

Брайан объяснил, «что», но если вам интересно, чтобы почему, вот отрывок из Денниса Ритчи The Development of the C Language:

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

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

    int i, *pi, **ppi;

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

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

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

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

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

Для получения дополнительной информации, читайте Стив Фридл в «Reading C type declarations» или Эрик Giguere в «Reading C Declarations: A Guide for the Mystified».