Это было предложено мне в интервью! я действительно запутался
- Как объявить массив из N указатели на возвращаемые функции указатели на возвращаемые функции указатели на символы
Кто-нибудь может помочь?
Это было предложено мне в интервью! я действительно запутался
Кто-нибудь может помочь?
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])())();
typedef char* (* tCharRetFunc)();
typedef tCharRetFunc (* tFuncRetCharFunc)();
tFuncRetCharFunc arr[N];
Разделите большую проблему на более мелкие части:
/* 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];
массив из N указателей на функции, возвращающие указатели на функции, возвращает a char:
int (*(*arr_fp[n])(void))(void)
Это то, что вы ищете:
typedef char* charptr;
typedef charptr (*innerfun)();
typedef innerfun (*outerfun)();
const size_t N = 10;
outerfun my_outerfun_array[N];
Надеюсь, я понял это правильно, мне кажется странным вопросом, особенно в интервью: (
Используя typedefs, как говорит Кристофер, вы действительно гуманный способ объявить такое. Без tyedefs это станет следующим:
char *(*(*arr[10])(void ))(void );
(да, мне пришлось обманывать и бегать cdecl > declare arr как массив 10 указателя на функцию (void) возвращающий указатель на функцию (void) возвращающий указатель на char)