Начните с левого идентификатору и работать свой путь, помня, что ()
и []
связывают, прежде *
, так:
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
.
запомнить По часовой стрелке/спиральное правило: http://c-faq.com/decl/spiral.anderson.html –
try cdecl ....... –
'declare var as array 3 функции, возвращающей указатель на function (указатель на функцию return void) return int' http://cdecl.org/ –