int *(*(*functions_array)[4]();
int *function() { /*code */ };
我知道使用指向函数int *(*func)();
的指针,我可以将函数的指针值分配给func func = &function;
,然后使用func();
进行调用。
除了增加数组,我最接近这种行为是什么?
答案 0 :(得分:1)
您可能想要这样:
#include <stdio.h>
int function1(void)
{
printf("function 1\n");
return 1;
};
int function2(void)
{
printf("function 2\n");
return 2;
};
int(*FunctionPointer)(void); // a function pointer
int(*ArrayOfFunctionPointers[4])(void); // an array of 4 function pointers
int main()
{
FunctionPointer = function1;
FunctionPointer(); // will call function1
FunctionPointer = function2;
FunctionPointer(); // will call function2
ArrayOfFunctionPointers[0] = function1;
ArrayOfFunctionPointers[1] = function2;
for (int i = 0; i < 2; i++)
{
ArrayOfFunctionPointers[i]();
}
}
输出:
function 1
function 2
function 1
function 2
答案 1 :(得分:1)
首先,您显示的声明格式错误。考虑到C语言中的声明符语法有多难,这不足为奇。如果您想要一个函数指针数组(我非常怀疑),那么原始拼写是这样的:
int *(*functions_array[4])();
可读性不强,但至少在语法上正确。现在,您可以对其进行索引以获得要使用的函数指针。例如:
functions_array[0] = function;
functions_array[0](); // Call the function
但是,如果您真的想要一个指向数组的指针(出于我无法理解的原因),则原始声明符是这样的:
int *(*(*functions_array_p)[4])();
现在具有吸引力较小的索引才能匹配:
(*functions_array_p)[0] = function;
(*functions_array_p)[0](); // Call the function
由于*
和[]
的常规优先级,因此必须加上括号。
但是使它使用和定义起来更容易的方法是引入一些类型别名。首先,对于函数类型:
typedef int* function_type();
现在,数组声明采用了更易读的形式:
function_type* functions_array[4];
星号清晰可见,这是不隐藏指针语义的一般良好习惯。
还有指向数组的指针:
function_type* (*functions_array)[4];
声明符的外观仍然很规则。
1.顺便说一句,C函数声明中的参数列表为空并不表示该函数不带参数。这是一个过时的功能,提供了没有原型的功能。前进的道路是(void)
。