массив из N указателей на функции, возвращающий указатели на функции - PullRequest
16 голосов
/ 03 февраля 2010

Об этом меня спросили в интервью! я действительно запутался

  • Как мне объявить массив из N указатели на функции, возвращающие указатели на функции, возвращающие указатели на символы

Может кто-нибудь помочь, пожалуйста?

Ответы [ 6 ]

33 голосов
/ 03 февраля 2010

Typedefs для wusses. Вот простой механический метод определения волосатых объявлений:

          a                 -- a
          a[N]              -- is an N-element array
         *a[N]              -- of pointers
        (*a[N])()           -- to functions
       *(*a[N])()           -- returning pointers
      (*(*a[N])())()        -- to functions
     *(*(*a[N])())()        -- returning pointers
char *(*(*a[N])())()        -- to char.  

Итак, ответ находится в окрестности char *(*(*a[N])())();. Я говорю «по соседству», так как никогда не указывается, какие аргументы принимают функции.

Это неприятный вопрос для собеседования (такие уродливые, это действительно редкий IME), но он дает интервьюеру представление о том, насколько хорошо вы понимаете деклараторов. Либо так, либо им было скучно, и они просто хотели посмотреть, могут ли они заставить мозг болеть.

EDIT

Большинство других рекомендует использовать typedefs. Единственный раз, когда я рекомендую использовать typedef, это если тип должен быть действительно непрозрачным (т.е. не манипулироваться непосредственно программистом, а передаваться в API, вроде как тип FILE). В противном случае, если программист предназначен для непосредственного манипулирования объектами этого типа, то в IME лучше иметь всю эту информацию доступной в объявлении, какой бы ужасной она ни была. Например, что-то вроде

 NameFuncPickerPointer a[N];

не дает мне никакой информации о том, как на самом деле использовать a[i]. Я не знаю, что a[i] может быть вызвано, или что он возвращает, или какие аргументы он должен принять (если есть), или многое другое. Мне нужно искать typedef

typedef char *NameFunc();
typedef NameFunc *NameFuncPicker();
typedef NameFuncPicker *NameFuncPickerPointer;

и из этой головоломки выясните, как написать выражение, которое фактически вызывает одну из функций. Принимая во внимание, что используя «голое» объявление, не являющееся typedef'd, я сразу же знаю, что структура вызова

char *theName = (*(*a[i])())();
6 голосов
/ 03 февраля 2010
typedef char* (* tCharRetFunc)();
typedef tCharRetFunc (* tFuncRetCharFunc)();

tFuncRetCharFunc arr[N];
3 голосов
/ 03 февраля 2010

Разделите большую проблему на более мелкие части:

/* char_func_ptr is pointer to function returning pointer to char */
typedef char* (*char_func_ptr)();

/* func_func_ptr is a pointer to function returning above type */
typedef char_func_ptr (*func_func_ptr)();

/* the_array is array of desired function pointers */
func_func_ptr the_array[42];
1 голос
/ 20 января 2012

массив из N указателей на функции, возвращающий указатели на функции, возвращает символ:

int (*(*arr_fp[n])(void))(void)
0 голосов
/ 03 февраля 2010

Использование typedefs, как говорит Кристофер, на самом деле - единственный гуманный способ объявить такую ​​вещь. Без tyedefs это станет:

char *(*(*arr[10])(void ))(void );

(да, мне пришлось обмануть и бежать cdecl> объявляет arr как массив 10 указателя на функцию (void), возвращающего указатель на функцию (void), возвращающего указатель на char)

0 голосов
/ 03 февраля 2010

Это то, что вы ищете:

typedef char* charptr;
typedef charptr (*innerfun)();
typedef innerfun (*outerfun)();

const size_t N = 10;
outerfun my_outerfun_array[N];

Надеюсь, я все правильно понял, мне кажется странным вопрос, особенно в интервью: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...