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

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

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

кто-либо мог помочь?

16
задан Euri Pinhollow 19 November 2017 в 18:38
поделиться

5 ответов

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

РЕДАКТИРОВАТЬ

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

 NameFuncPickerPointer a[N];

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

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

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

char *theName = (*(*a[i])())();
33
ответ дан 30 November 2019 в 16:09
поделиться

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

/* 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];
3
ответ дан 30 November 2019 в 16:09
поделиться

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

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

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

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

0
ответ дан 30 November 2019 в 16:09
поделиться

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

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

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

0
ответ дан 30 November 2019 в 16:09
поделиться
typedef char* (* tCharRetFunc)();
typedef tCharRetFunc (* tFuncRetCharFunc)();

tFuncRetCharFunc arr[N];
6
ответ дан 30 November 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: