标签:
函数指针是指向函数调用地址的指针。它和函数名究竟有什么关系呢?且看下文。
首先,先请看下边程序:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 void func(string s) 6 { 7 cout << s << endl; 8 } 9 10 void (*pFunc)(string s); // 不能够写成 void *pFunc(string s); 11 // 继续看下文解释 12 13 int main() 14 { 15 cout << endl; 16 func("Original Function : 1st circumstance!"); 17 (*func)("Original Function : 2nd circumstance!"); 18 19 cout << endl; 20 pFunc = &func; 21 (*pFunc)("Function pointer : 1st circumstance!"); 22 pFunc("Function pointer : 2nd circumstance!"); 23 24 cout << endl; 25 pFunc = func; 26 (*pFunc)("Function pointer : 3rd circumstance!"); 27 pFunc("Function pointer : 4th circumstance!"); 28 29 return 0; 30 }
程序的运行结果如下:
从上边程序,我们可以得到下边结论:
1. 函数指针和函数名本质上是一样的,都是指向函数调用地址的指针,只是函数名是常量指针,函数指针是变量。
2. 调用函数的写法func()、(*func)()均可,而我们大多数情况下都会写成前者,应该是(C/C++标准制定者)为了方便大家对函数的调用。
对于前者,我们都知道pFunc是函数指针变量,函数的返回值是空(void)。
对于后者而言,情况却很不一样。pFunc是函数指针常量,函数的返回值是void指针。
回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么这就是回调机制。A函数就是回调函数,而通常情况下,A函数是系统在符合你设定条件的情况下会自动执行。
例如Linux下的多线程创建函数
#include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg); // 返回:若成功返回0,否则返回错误编号
中的 start_rtn 就是一个回调函数。
关于回调函数详细可参考知乎上问答回调函数(callback)是什么?。
标签:
原文地址:http://www.cnblogs.com/xiehongfeng100/p/4671958.html