嗨,我正在尝试做一个函数指针数组,我尝试了两件事:
int (*pointer[2])(int, int);
完美运行
int (*pointer)[2](int, int);
不编译:“数组元素类型不能是函数”
根据我的理解,两者应该产生相同的结果,有什么可以解释差异?
谢谢你的帮助
嗨,我正在尝试做一个函数指针数组,我尝试了两件事:
int (*pointer[2])(int, int);
完美运行
int (*pointer)[2](int, int);
不编译:“数组元素类型不能是函数”
根据我的理解,两者应该产生相同的结果,有什么可以解释差异?
谢谢你的帮助
像这样的 C 和 C++ 定义必须从内到外阅读。从定义的名称开始,向右移动,直到到达结束括号或声明的结尾。之后,从上一个停止点回到左边,直到你到达一个开头的括号或声明的开头(之后你再次回到右边,依此类推,直到你看到整个事情) 1。考虑到这一点,让我们考虑您的第一个声明/定义:
int (*pointer[2])(int, int);
因此,从 开始pointer
,我们一直向右直到到达结束括号,所以我们一直到pointer is an array of 2
,然后我们击中括号,所以我们继续向左pointer
到达星号,所以我们添加pointers
,给出pointer is an array of two pointers
。我们击中了open paren,所以我们继续向右。我们现在在括号之外,我们找到了(int int)
,所以我们添加了“到带有两个int
s 的函数”,最后我们再次向左移动,得到“并返回int
”。因此,我们的总体定义是“指针是一个包含两个指向函数的指针的数组,该函数采用两个整数并返回一个整数。” 这很好,编译器按预期接受它。
我们对第二个遵循相同的想法:int (*pointer)[2](int, int);
在这里,我们在 之后立即点击右括号pointer
,所以我们直接转到pointer is a pointer
,然后我们走出那个括号(并且向右)并获得“到 2 的数组”。然后我们继续前进(我们击中了一个开放的括号,而不是一个关闭的括号)并获得“函数采用两个整数”。在那里,我们到达了定义的结尾,所以我们回到左边并得到“和返回的 int”。因此,总体定义是:“指针是一个指向两个函数数组的指针,该数组以两个 int 作为参数并返回一个 int。”
由于我们不能有函数数组,这会产生错误。
1. 有些人为此想出了“螺旋规则”、“顺时针规则”等名称,但我发现这些名称更具误导性而不是帮助。大多数人都陷入了自己的“可爱”之中,忘记了清楚地阐明何时停止向一个方向前进并重新开始转向另一个方向的真正规则。
始终将 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'声明为函数数组”。