函数指针(Function Pointers)

原创 2006年05月23日 23:15:00

函数指针(Function Pointers

 

我们可以像下面那样声明一个指向特定类型函数的指针:

void (*fp)(int);       //指向函数的指针

注意,其中的括号是必不可少的,它表明fp是一个指向返回值为void的函数的指针,而不是返回值为void* 的函数。就像指向普通数据的一样,指向函数的指针也可以为空,否则它就应该指向一个具有适当类型的函数。

例如:

 

注意,将一个函数的地址初始化或赋值给一个指向函数的指针时,无需要显式地取得函数地址,编译器知道隐式地获取函数的地址,因此在这种情况下’&’操作符是可选的,通常省略不用。

       类似地,为了调用函数指针所指向的函数而对指针进行解引用操作也是不必要的,因为编译器可以帮你解引用:



 

       void* 指针可以指向任何类型的数据不同,不存在可以指向任何类型函数的通用函数指针。还要注意,非静态成员函数的地址不是一个指针,因此不可以将一个函数指针指向一个非静态成员函数。(详细参见其它介绍文档)

 

       函数指针的一个传统用途是实现回调(callback)。一个回调是一个可能的动作,这个动作在初始化阶段设置,以便在对将来可能发生的事件做出反应时而被调用。举个例子,如果我们希望救火,那么最好事先计划好该如何做出反应:

 

       一旦决定了要执行的动作,代码中的另一个部分就是可以专注于是否以及何时去执行该动作,而无需关心这个动作到底是做什么的:

 

       注意,一个函数指针指向内联函数(inline function)是合法的。然而,通过函数指针调用内联函数将不会导致内联式的函数调用,因为编译器通常无法在编译期间精确地确定将会调用什么函数。在上一个例子中,fireAction可能指向两个函数中的任一个(当然,也可能两个都不指向),因此在调用点,编译器别无它法,只好生成间接、非内联的函数调用代码。

 

       另外,函数指针持有一个重载函数的地址也是合法的:

       指针的类型被用于在各种不同的候选函数中挑选最佳匹配的函数。在这个例子中,fireAction的类型为void(*)(),因此选择的是第一个jumpIn函数。

 

       在标准库中,在好几个地方使用了函数指针作为回调机制,最为突出的就是被标准函数set_new_handler用于设置回调。当全局operator new函数无法履行一个内存分配请求时,该回调函数即被调用。例如:

 

       标准类型名称new_handler是一个typedef:

       typedef void (*new_handler)();

       因此,该回调函数必须是一个不带参数且返回void的函数。Set_new_handler函数将回调设置为参数,并且返回前一个回调。不存在什么单独的用于获得和设置回调的函数。获得当前回调需要采用一种回旋式的惯用手法:

 

       另外,标准函数set_terminateset_unexpected也使用了这种合二为一的get/set回调习惯用法。

 

 

 

 

Programs as Data: Function Pointers(函数指针)

原文链接:http://www.cprogramming.com/tutorial/function-pointers.html A function pointer is a variable t...
  • shexinwei
  • shexinwei
  • 2011年09月04日 16:27
  • 302

Item 14. 函数指针(Function Pointers)

Item 14. Function Pointers函数指针的声明: void (*fp)(int); //括号不能省略,去掉则为返回类型为void*使用: 1、当初始化或赋值函数指针A的地址给函数指...
  • mythma
  • mythma
  • 2005年04月12日 10:10
  • 881

C++委托实现(函数指针,function+bind,委托模式)

这一段在公司的某个框架代码中看到了函数指针的使用。风格比较偏纯C,其实C++有更加合适的解决方案,在这里总结一下。   首先从函数指针说起。      一、函数指针   从定义上讲,函数指针指...
  • lijun538
  • lijun538
  • 2016年04月28日 20:54
  • 1461

函数指针,function,bind, lambda

函数指针,sd::function functionObject, std::bind() 1. 函数指针是类型不安全的,为什么? #include int max(int x,int y){re...
  • viewcode
  • viewcode
  • 2015年02月27日 18:25
  • 1385

C++函数指针、函数对象与C++11 function对象对比分析

1.函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。函数指针主要由以下两方面的用途:调用函数和用作函数参数。 函数指针...
  • skillart
  • skillart
  • 2016年08月27日 18:06
  • 1465

【cocos2dx】std::function与std::bind 函数指针

函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一...
  • eclipse_c
  • eclipse_c
  • 2014年12月30日 20:23
  • 973

boost源码剖析之:泛型函数指针类boost::function(rev#3)

boost源码剖析之:泛型函数指针类boost::function(rev#3) 刘未鹏C++的罗浮宫(http://blog.csdn.net/pongba) Note: 并非新作,03年曾放在bl...
  • pongba
  • pongba
  • 2007年04月11日 16:31
  • 22192

函数指针与function对象

《effective C++》p171-p174 #include #include using namespace std; //function对象( 也可直接写作typedef ...
  • richrdbird
  • richrdbird
  • 2016年04月24日 14:50
  • 200

Pointers to Function

Function type A function type is determined by its return value and parameter list Pointers to...
  • mamalolo
  • mamalolo
  • 2013年03月27日 21:13
  • 205

Function Pointers

A function pointer is a variable that stores the address of a function that can later be called thro...
  • shawhe
  • shawhe
  • 2013年09月26日 16:46
  • 580
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:函数指针(Function Pointers)
举报原因:
原因补充:

(最多只允许输入30个字)