在* pfoo括号是必要的优先的原因,如int * pfoo()将被解释为一个函数名为pfoo,不带参数,并返回一个指向一个整数。
在上面的代码片段中,pfoo是一个指向函数的指针,没有参数,并返回一个整型数。pfoo可以“点”匹配这个签名的任何功能。
一个函数指针分配函数
有两个你可以做一个指向函数的指针主要的东西。首先,你可以指定一个函数,它:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int
foo() { } int
goo() { } int
main() { int
(*pFoo)() = foo; //
pFoo points to function foo() pFoo
= goo; //
pFoo now points to function goo() return
0; } |
这实际上会指定返回值的函数调用goo()到pfoo,这并不是我们想要的。我们希望pfoo被分配到功能良好,没有从goo()返回值。所以没有圆括号是必需的。
请注意,签名(参数和返回值的函数指针必须)函数的签名匹配。这里是一个例子:
1
2
3
4
5
6
7
8
9
10
11
|
//
function prototypes int
foo(); double
goo(); int
hoo( int
nX); //
function pointer assignments int
(*pFcn1)() = foo; //
okay int
(*pFcn2)() = goo; //
wrong -- return types don't match! double
(*pFcn3)() = goo; //
okay pFcn1
= hoo; //
wrong -- pFcn1 has no parameters, but hoo() does int
(*pFcn3)( int )
= hoo; //
okay |
调用一个函数使用一个函数指针
你可以用一个函数指针的第二件事是用它来调用函数。有两种方法来做这个。首先是通过显式解引用:
1
2
3
4
5
6
7
|
int
foo( int
nX) { } int
(*pFoo)( int )
= foo; //
assign pFoo to foo() (*pFoo)(nValue);
//
call function foo(nValue) through pFoo. |