这个问题是面试中问我的!我真的很困惑。
- 如何声明一个包含N个指向函数的指针的数组,它们返回指向函数的指针,这些函数又返回指向字符的指针?
有没有人能帮忙解答一下?
类型定义是为了懒人。这里有一种直接而机械化的方法来解决复杂的声明:
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])())();
附近。我说“附近”,因为从未指定函数需要什么参数。 NameFuncPickerPointer a[N];
这并没有告诉我如何实际使用a[i]
。我不知道a[i]
是否可调用,或者它返回什么,或者它应该接受哪些参数(如果有),或者其他任何信息。我必须去寻找typedef。
typedef char *NameFunc();
typedef NameFunc *NameFuncPicker();
typedef NameFuncPicker *NameFuncPickerPointer;
从那个难题中推断出如何编写实际调用其中一个函数的表达式。如果使用“裸露”的、未经过typedef定义的声明,则我立即知道调用的结构是什么。
char *theName = (*(*a[i])())();
StringGetter_Getter a[N]
、StringGetter_Getter_Array a
或者FunctionTable a
。它必须在代码上下文中有一定的意义,我宁愿看到StringGetter_Getter
在各个地方重复出现,也不愿看到char *(*(*)())()
这样的东西。但是这很容易陷入与是否命名常量相同的争论:“如果有人使用80,我不想去查找DEFAULT_HTTP_PORT的值,我想在源代码中看到80”。作为程序员,间接引用是我们所有问题的根源和解决方案。 - Steve Jessoptypedef 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个指向返回指针的函数的指针数组,返回一个字符:
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];
我希望我的答案是正确的,对我来说这似乎是一个奇怪的问题,特别是在面试中 :(
像Christopher告诉你的那样使用typedef是声明这种东西的唯一人性化方式。没有typedef,它将变成:
char *(*(*arr[10])(void ))(void );
(是的,我得作弊了,运行 cdecl> 声明一个数组arr,大小为10,元素类型为指向函数(无参数)返回指向函数(无参数)返回指向字符的指针)
apt-get install cdecl; echo declare array of pointer to function returning pointer to function returning pointer to char | cdecl;
>>>char *(*(*var[])())()
- Mehrdad Afshari