数组元素类型不能是函数

时间:2013-10-29 01:52:52

标签: c++

您好我正在尝试做一个函数指针数组,我尝试了两件事:

int (*pointer[2])(int, int);完美无缺

int (*pointer)[2](int, int);无法编译:“数组元素类型不能是函数”

根据我的理解,两者应该产生相同的结果,有什么可以解释差异?

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

像这样的C和C ++定义必须从里到外阅读。从定义的名称开始,向右行进,直到您到达结束报告或声明结束。在那之后,从上一个停止点返回到左边,直到你到达开始状态或声明的开头(之后你再次回到右边,依此类推,直到你看完了整个事情) 1 。考虑到这一点,让我们考虑您的第一个声明/定义:

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'声明为函数数组”。