当我尝试编译以下行时
int* x[](), (*y)();
我得到错误" x声明为int()"
类型的函数数组答案 0 :(得分:3)
你不能真正声明一个函数数组,但你可以有一个函数指针数组,这可能会给你相同的效果,因为你可以调用它们而无需显式解除引用。
以下将声明一个返回5
的{{1}}函数指针数组。
int*
网站cdecl将让您使用各种指针声明来查看它们在英语中的含义。
以下是黄金法则,用于阅读从old article偷来的C声明。
从变量名称开始(如果没有标识符,则从最内层构造开始) 当下。向右看而不跳过右括号;说什么 你看。再看左边而不跳过括号;说什么 你看。如果有的话,跳出一个括号级别。向右看;说什么 你看。看左边;说出你所看到的。以这种方式继续,直到 你说变量类型或返回类型。
当应用于上述声明时,我们说:
正如SteveCox在下面正确评论的那样,我们注意到如果我们在遵循上述规则时遇到左侧的类型限定符,它将描述其左侧而不是右侧的类型。例如,以下声明声明了一个包含5个指针的数组,这些指针返回 const指向int 的指针,而不是指向const int的指针。
int* (*x[5])();
答案 1 :(得分:1)
尝试使用2个函数指针的数组。
#include <stdio.h>
int *first(void) { return NULL; }
int *second(void) { return NULL; }
int main(void) {
int *(*fx[2])(void);
fx[0] = first;
fx[1] = second;
/* ... */
if (fx[0]() == fx[1]()) {
printf("Calling both functions returns the same value.\n");
}
return 0;
}
答案 2 :(得分:0)
实际应用可能如下所示:
#include <ansi_c.h>
int add_(int, int);
int sub_(int, int);
int mul_(int, int);
int div_(int, int);
enum {
ADD,
SUB,
MUL,
DIV
};
int (*mathOps[4])(int, int);
int main(void)
{
int i;
mathOps[ADD]=add_;
mathOps[SUB]=sub_;
mathOps[MUL]=mul_;
mathOps[DIV]=div_;
for(i=ADD;i<=DIV;i++)
{
printf("results are: %d\n", mathOps[i](3, 3));
}
getchar();
return 0;
}
int add_(int a, int b)
{
return a + b;
}
int sub_(int a, int b)
{
return a - b;
}
int mul_(int a, int b)
{
return a * b;
}
int div_(int a, int b)
{
return a / b;
}