函数指针是指向函数的指针变量。 因此“函数指针”本身首先应该是一个指针变量,只不过该指针变量指向的是函数。
有了指向函数的指针变量后,就可以用该指针变量来调用函数,就如同用指针变量可引用其他类型变量一样,函数指针有两个用途:调用函数和做函数的参数。
1. 函数指针的声明:
返回值类型 ( * 指针变量名) ([形参列表]);
如: int(* func) (int a, int b);
声明了一个函数指针func, func指向的函数必须满足两个整形的参数,返回值为int, 其中指针名称的()不能省略,否则将变成普通函数的声明。
2. 函数的调用
(1)直接定义函数指针
#include "stdafx.h"
#include <iostream>
using namespace std;
int sum(int a, int b)
{
return (a + b);
}
int subtract(int a, int b)
{
return (a - b);
}
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << sum << endl;
std::cout << *sum << endl;
std::cout << &sum << endl;
int(*func)(int, int);
func = sum;
int c = (*func)(1, 2);
std::cout << c << endl;
std::cout << func << endl;
std::cout << *func << endl;
std::cout << *&func << endl;
int d = sum(1, 2);
std::cout << d << endl;
std::cout << subtract << endl;
std::cout << *subtract << endl;
std::cout << &subtract << endl;
func = subtract;
c = (*func)(1, 2);
std::cout << c << endl;
std::cout << func << endl;
std::cout << *func << endl;
std::cout << *&func << endl;
d = subtract(1, 2);
std::cout << d << endl;
return 0;
}
运行结果如下:
通过上面的运行结果可以发现:
函数的名称其实就是该函数的入口地址,可以取地址或者直接赋值给函数指针。函数指针func只是声明了指向的函数的类型(即函数返回值和参数类型),只要是符合该类型的函数都可以赋值给该函数指针func。
(2) 先定义函数指针类型,再声明变量并赋值
先定义函数指针类型:
typedef int (*fun_ptr)(int,int);
再声明变量,赋值:
fun_ptr fp = sum;
赋给函数指针的函数必须和函数指针所指的函数原型是一致的。
#include "stdafx.h"
#include <iostream>
using namespace std;
int sum(int a, int b)
{
return (a + b);
}
int subtract(int a, int b)
{
return (a - b);
}
int _tmain(int argc, _TCHAR* argv[])
{
typedef int(*fun_ptr)(int, int);
fun_ptr fp = sum;
int c = fp(1, 2);
std::cout << c << endl;
return 0;
}
3. 函数指针做函数的参数
函数指针我所使用到的最常用的就是用作回调函数。
比如信号处理函数,函数指针的定义和使用如下:
typedef void (*__sighandler_t) (int);
__sighandler_t signal (int __sig, __sighandler_t __handler);
#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;
void handler(int signo)
{
std::cout << "catch a signal:" << signo << endl;
}
void handler1(int sig)
{
std::cout << "catch a signal:" << sig << endl;
}
int main()
{
cout << "Hello World!" << endl;
signal(SIGINT, handler);
signal(SIGTSTP, SIG_DFL);
while(true)
{
std::cout << "test111" << std::endl;
sleep(1);
}
}
运行结果如下: