返回指向函数指针的函数的N个指针数组

这是在接受采访时向我询问的! 我真的很困惑

  • 如何声明一个N指针数组的数组,返回指向返回指向字符指针的函数的指针

有人可以帮忙吗?

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])())();附近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; 

从那个难题出来,如何编写实际调用其中一个函数的表达式。 使用“裸”,非typedef的声明,我立即知道调用的结构是

 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个指针数组返回一个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]; 

我希望我弄错了,这对我来说似乎是一个奇怪的问题,尤其是在采访中:(

使用typedef就像克里斯托弗告诉你的那样,只是人道的方式来宣告这样的事情。 没有tyedefs,它将成为:

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

(是的,我不得不作弊并运行cdecl>声明arr作为函数指针的数组10(void)返回指向函数的函数(void)返回指向char的指针