Правило для чтения волосатых декларации начать с крайней левой идентификатору и работать свой путь, помня, что ()
и []
связывают, прежде *
(т.е. *a[]
представляет собой массив указателей, (*a)[]
является указателем на массив, *f()
функция возвращает указатель, и (*f)()
является указателем на функцию):
GetPtr1 -- GetPtr1
GetPtr1( ) -- is a function
GetPtr1( opCode) -- taking a single parameter named opCode
GetPtr1(const char opCode) -- of type const char
*GetPtr1(const char opCode) -- and returning a pointer
(*GetPtr1(const char opCode)) ( ) -- to a function
(*GetPtr1(const char opCode)) (float, float) -- taking two parameters of type float
float (*GetPtr1(const char opCode)) (float, float) -- and returning float
Таким образом, если opCode
равно «+», GetPtr1
воли г eturn указатель на функцию Plus
, и если это '-', он вернет указатель на функцию Minus
.
Синтаксис объявления C и C++ является ориентированным на выражение (так как Бьярне хотел бы притвориться иначе); форма объявления должна соответствовать форме выражения, так как она будет использоваться в коде.
Если мы имеем функцию f
, которая возвращает указатель на int
и мы хотим получить доступ к значению на который указывает на, мы выполняем функцию и разыменования результат:
x = *f();
Типом выражения*f()
является int
, поэтому объявление/определение функции является
int *f() { ... }
Теперь предположим, что мы имеем функцию f1
, который возвращает указатель на указанную выше функцию f
, и мы хотим получить это целочисленное значение, вызвав f1
. Нам нужно вызвать f1
, derefence результата (который является функцией f
), и выполнить его, а затем разыменование что результата (так как f
возвращает указатель):
x = *(*f1())(); // *f1() == f, so (*f1())() == f() and *(*f1())() == *f()
Типом выражения*(*f1())()
является int
, поэтому decaration/определение f1
потребности быть
int *(*f1())() { return f; }
может быть лучше, чтобы проверить «еще если (опкод ==„-“)», чтобы избежать горения некоторые полуночное масло в грядущих событий re – Chubsdad
Тема не говорит много о вашем вопросе .. Это должно быть. – mih