2016-09-06 2 views
-2
int (*(*var[3])())(void (*)()); 

Как бы вы описали тип var в приведенном выше описании?Опишите: int (* (* var [3])()) (void (*)());

я получаю:

Объявляет вар как массив из 3 указателей на функции (A)

  • Эти функции (A) принимают любые входы и возвращают указатель на функцию (B)

  • Эти функции (B) принимает указатель на функцию (C) и возвращающие INT

  • Эти функции (C) принимают любые входы и не возвращают ничего

Это право? Благодаря

+1

запомнить По часовой стрелке/спиральное правило: http://c-faq.com/decl/spiral.anderson.html –

+1

try cdecl ....... –

+0

'declare var as array 3 функции, возвращающей указатель на function (указатель на функцию return void) return int' http://cdecl.org/ –

ответ

3

Начните с левого идентификатору и работать свой путь, помня, что () и [] связывают, прежде *, так:

T *a[N]  // a is an array of pointer to T 
T (*a)[N] // a is a pointer to an array of T 
T *f()  // f is a function returning pointer to T 
T (*f)()  // f is a pointer to a function returning T 

Редактировать

Хотя это не проявляется в в этой декларации const может ввести собственную долю морщин:

T const *p // p is a pointer to constant T 
const T *p // same as above 

В обоих случаях p указывает на константу T. Вы можете написать p (укажите его на другой объект), но вы не можете написать *p (вы не можете обновить значение вещи p пунктов).

T * const p // p is a constant pointer to T 

Объявляет p как постоянный указатель на T; Вы можете написать *p (обновите значение вещи p указывает на то, что *p приводит к изменяемому значению lvalue), но вы не можете написать p (вы не можете указать его на другой объект).

Конец редактировать

Так

 var      -- var is a 
     var[3]     -- 3-element array of 
     *var[3]     -- pointer to 
     (*var[3])()    -- function taking 
     (*var[3])()    -- unspecified parameters 
    *(*var[3])()    -- returning pointer to 
    (*(*var[3])())(  ) -- function taking 
    (*(*var[3])())(  ) -- unnamed parameter is a 
    (*(*var[3])())(  * ) -- pointer to 
    (*(*var[3])())( (*)()) -- function taking 
    (*(*var[3])())( (*)()) --  unspecified parameters 
    (*(*var[3])())(void (*)()) -- returning void 
int (*(*var[3])())(void (*)()); -- returning int 

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

+0

Не столь серьезное замечание,' var' также может быть описано как содержащее (по крайней мере) 3 причины для вашего коллеги, чтобы пощекотать вас на запястьях, неопределенное количество непонятных нарушений доступа во время выполнения, ожидающих своего появления, и подразумеваемый '' I quit! ''строковый литерал. Просто потому, что вы можете, это не значит, что вы должны. – sendaran

+0

@sendaran: существуют допустимые примеры использования таблиц указателей функций; однако, таблица указателей на функции, содержащие указатели на функции, растягивает ее. –

+0

Конечно, таблицы указателей функций - это мое предпочтительное решение для замены громоздких коммутационных футляров коммутационного шкафа и аналогичного значения для сопоставлений действий. Иногда, как и в текущем примере, все идет по борту, и ваше намерение теряется в загадочном синтаксисе. Тогда вам нужно успокоиться и переосмыслить свой жизненный выбор. Лично я считаю использование указателей функций без «typedef» просто злого. Без синтаксического кода сахара может стать горьким. – sendaran