您好我正在尝试做一个函数指针数组,我尝试了两件事:
int (*pointer[2])(int, int);
完美无缺
int (*pointer)[2](int, int);
无法编译:“数组元素类型不能是函数”
根据我的理解,两者应该产生相同的结果,有什么可以解释差异?
感谢您的帮助
答案 0 :(得分:5)
int (*pointer[2])(int, int);
所以,从pointer
开始,我们继续直到我们到达一个关闭的paren,所以我们到达pointer is an array of 2
,然后我们击中了paren,所以我们继续前进到{ {1}}要转到星号,我们添加pointer
,提供pointers
。我们击中了开放式的paren,所以我们向右走。我们现在在parens之外,我们找到了pointer is an array of two pointers
,所以我们添加“到两个(int int)
s的函数”,最后我们再次向左移动,并得到“并返回{{ 1}}”。所以,我们的总体定义是“指针是一个两个指针的数组,它指向两个int并返回一个int的函数。”这很好,并且编译器会按预期接受它。
我们对第二个问题采用相同的想法:int
我们在int
之后立即点击右边的paren,所以我们直接转到int (*pointer)[2](int, int);
,然后我们走到那个parens(和右边)之外,然后“到2的数组”。然后我们继续正确行进(我们打开了一个开放的paren,而不是一个紧密的paren)并获得“两个整数的功能”。在那里我们点击了定义的结尾,所以我们回到左边并得到“并返回int”。因此,整体定义是:“指针是一个指向两个函数数组的指针,它们将两个int作为参数并返回一个int。”
由于我们不能拥有函数数组,因此会出错。
<子> 有些人为此提出了诸如“螺旋规则”,“顺时针规则”等名称,但我发现这些名称更具误导性而非有用。大多数人都陷入了自己的“可爱”之中,忘记清楚地阐明何时停止前进一个方向的真正规则,并再次开始寻找另一个方向。 子>
答案 1 :(得分:0)
始终将typedef与函数指针一起使用。这是最简单的方法。
typedef int (*func_ptr)(int, int);
typedef func_ptr fps[2];
fps
是一种指向函数的指针数组。
你的第二个例子就像这样:
typedef int func(int, int); // legal! defines a function type. not a pointer.
typedef func fs[2]; // Illegal: an array of function.
typedef fs* pfs; // The type you tried to get:
// A pointer to an array of functions.
你得到一个错误:“将'fs'声明为函数数组”。