Беспорядочная интерпретация указателя на функцию
Я случайно наткнулся на следующий указатель на функцию.
char (*(*x())[])();
Это выглядит как массив указателей на функции в следующем формате, но я не могу понять, что означает f -> (*x()). Как интерпретировать этот беспорядочный указатель функции?
char (*f[])();
ADDED
С помощью Джона Боде я делаю пример следующим образом.
#include <stdio.h>
char foo() { return 'a'; }
char bar() { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }
char (*gfunclist[])() = {foo, bar, blurga, bletch};
char (*(*x())[])()
{
static char (*funclist[4])() = {foo, bar, blurga, bletch};
return &funclist;
}
int main()
{
printf("%c\n",gfunclist[0]());
char (*(*fs)[4])();
fs = x();
printf("%c\n",(*fs)[1]());
}
Я мог бы получить ожидаемый результат.
smcho @ prosseek temp2>./a.out б
И вы можете найти лучшую реализацию здесь.
5 ответов
Моя общая процедура состоит в том, чтобы найти самый левый идентификатор в объявлении, а затем найти выход, помня, что []
а также ()
связать перед *
(То есть, *f()
обычно анализируется как *(f())
а также *a[]
обычно анализируется как *(a[])
).
Так,
x -- x
x() -- is a function
*x() -- returning a pointer
(*x())[] -- to an array
*(*x())[] -- of pointers
(*(*x())[])() -- to functions
char (*(*x())[])(); -- returning char
Как будет выглядеть такой зверь на практике?
char foo() { return 'a'; }
char bar() { return 'b'; }
char blurga() { return 'c'; }
char bletch() { return 'd'; }
/**
* funclist -- funclist
* funclist[] -- is an array
* *funclist[] -- of pointers
* (*funclist[])() -- to functions
* char (*funclist[])() -- returning char
*/
char (*funclist[])() = {foo, bar, blurga, bletch};
Выражение &funclist
вернет указатель на массив, так
char (*(*x())[])()
{
return &funclist;
}
char (*(*x())[])();
x is a function returning pointer to array of pointer to function returning char
char (*f[])();
В этом случае f is an array of pointer to function returning char
Использование правила справа налево было бы полезно.
cdecl> explain char (*(*x())[])();
declare x as function returning pointer to array of pointer to function returning char
Несколько typedefs делают это понятнее:
typedef char (*charfunc_t)();
Это определяет charfunc_t
быть указателем на функцию без аргументов, которая возвращает char
,
typedef charfunc_t funcarr_t[];
funcarr_t
массив таких указателей на функции
x
является функцией, возвращающей указатель на такой массив, и теперь она может быть объявлена так:
funcarr_t* x();
Посетите этот сайт, чтобы помочь вам понять c декларации ( ht tp://www.cdecl.org/), если вы введете выше, он скажет вам это
объявить x как функцию, возвращающую указатель на массив указателей на функцию, возвращающую char