Подтвердить что ты не робот

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

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

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

Кто-нибудь может помочь?

4b9b3361

Ответ 1

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), но это дает интервьюеру представление о том, насколько хорошо вы понимаете деклараторов. Либо это, либо им было скучно и просто хотелось посмотреть, могут ли они заставить ваш мозг зависнуть.

ИЗМЕНИТЬ

Большинство остальных рекомендует использовать 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])())();

Ответ 2

typedef char* (* tCharRetFunc)();
typedef tCharRetFunc (* tFuncRetCharFunc)();

tFuncRetCharFunc arr[N];

Ответ 3

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

/* 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];

Ответ 4

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

int (*(*arr_fp[n])(void))(void)

Ответ 5

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

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

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

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

Ответ 6

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

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

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