Я натолкнулся на две декларации указателей, которые мне трудно понять. Мое понимание правил приоритета выглядит примерно так:
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
Но даже учитывая это, я не могу понять, как правильно оценить следующие примеры:
Первый пример
float * (* (*ptr)(int))(double **,char c)
Моя оценка:
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
Потом,
double **
char c
Второй пример
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
Как я должен их читать?
Ответы:
Я предпочитаю первое : ptr - это указатель на функцию, которая принимает в качестве параметра int и возвращает указатель на функцию, которая принимает в качестве параметров указатель на указатель на double и символ и возвращает указатель на float.
Интерпретация :
(* PTR) (целое)
говорит, что ptr - это указатель на функцию, принимающую int в качестве аргумента. Чтобы узнать, что возвращает эта функция, нам нужно расширить наше представление:
(* (* ptr) (int))
это означает, что функция возвращает указатель на другую функцию. Параметры этой другой функции:
(двойной **, символ с)
и он возвращается
плавать *
И для второго : ptr - это указатель на массив из пяти указателей на функции, которые принимают в качестве параметров постоянный указатель на char и указатель на int, возвращая указатель на указатель на unsigned int.
Интерпретация :
(* (* ptr) [5])
объявляет ptr как указатель на массив из пяти указателей на функцию, принимающую
(char const *, int *)
в качестве аргументов и возвращения
без знака **
источник
Вы можете попробовать «Спираль по часовой стрелке», чтобы понять эти безумные заявления:
http://c-faq.com/decl/spiral.anderson.html
Я тоже писал об этом здесь:
http://www.kalekold.net/index.php?post=4
источник
Это указатель на функцию. Человек, который написал это, мог бы лучше использовать typedefs, чтобы сделать его более понятным.
По сути это указатель на функцию с этими параметрами. float * myfunc (double **, char)
источник
Используя cdecl.org:
объявить bar как константный указатель на массив 5 указателя на функцию (int), возвращающий константный указатель на символ
объявить ptr как указатель на массив 5 указателя на функцию (указатель на const char, указатель на int), возвращающий указатель на указатель на unsigned
источник