函数指针和指针函数
1.两个例子:
(1)void *func(void); 这是指针函数的一个例子。按照()的优先级高于*,所以这是一个函数,返回值为指针。
(2)void (*func)(void); 这是函数指针的一个例子。函数指针本身是一个指针,指向的是原型为void f(void)的函数。你只需要func=函数名,然后func().即可调用那个函数。
对void(*PF(void (*func)()))();的理解可以展开:
以上程序均在ubuntu+codeblocks环境下通过测试。
(1)void *func(void); 这是指针函数的一个例子。按照()的优先级高于*,所以这是一个函数,返回值为指针。
(2)void (*func)(void); 这是函数指针的一个例子。函数指针本身是一个指针,指向的是原型为void f(void)的函数。你只需要func=函数名,然后func().即可调用那个函数。
-
#include <iostream>
-
-
using
namespace std;
-
void f() {
-
cout <<
"f()" << endl;
-
}
-
void g() {
-
cout <<
"g()" << endl;
-
}
-
void h() {
-
cout <<
"h()" << endl;
-
}
-
void (*my_func)();
-
int main()
-
{
-
my_func = f;
-
my_func();
-
return
0;
-
}
2.typedef void (*func)(void);这里把func作为函数指针的同义词。这个函数的原型为void f(void);
-
#include <iostream>
-
-
using
namespace std;
-
void f() {
-
cout <<
"f()" << endl;
-
}
-
void g() {
-
cout <<
"g()" << endl;
-
}
-
void h() {
-
cout <<
"h()" << endl;
-
}
-
typedef void(*PF)();
-
int main()
-
{
-
PF pf= f;
-
pf();
-
return
0;
-
}
3.用函数指针作为函数的返回值。
-
#include <iostream>
-
-
using
namespace std;
-
void f() {
-
cout <<
"f()" << endl;
-
}
-
void g() {
-
cout <<
"g()" << endl;
-
}
-
void h() {
-
cout <<
"h()" << endl;
-
}
-
void (*my_func)();
-
//指定调用的函数
-
void(*
PF(
void (*func)()))() {
-
void(*old)() = my_func;
-
my_func = func;
-
return old;
-
}
-
int main()
-
{
-
my_func = f;
-
PF(h)();
-
my_func();
-
return
0;
-
}
分析:上面小程序的作用是为my_func指定要调用的函数。而void(*PF(void (*func)()))()即完成了这个任务。
对void(*PF(void (*func)()))();的理解可以展开:
-
typedef void(*PF)();
-
PF func(void(*p)()) {}
所以上面的 程序还可以这样写:
-
#include <iostream>
-
-
using
namespace std;
-
void f() {
-
cout <<
"f()" << endl;
-
}
-
void g() {
-
cout <<
"g()" << endl;
-
}
-
void h() {
-
cout <<
"h()" << endl;
-
}
-
void (*my_func)();
-
typedef void(*PF)();
-
PF (func)(
void(*p)()) {
-
void(*old)() = my_func;
-
my_func = p;
-
return old;
-
}
-
int main()
-
{
-
my_func = f;
-
func(h)();
-
my_func();
-
return
0;
-
}
总结:函数指针确实比较难理解。但是好在函数指针的作用并不是很常用。函数指针通常用来指定要调用的函数。这也是我在看"STL源码剖析"的时候,才注意到了这种用法。
以上程序均在ubuntu+codeblocks环境下通过测试。