C++指向函数的指针用法详解

本文以实例形式展示了C++指向函数的指针用法,是深入学习C++所必须掌握的关键知识点。分享给大家供大家参考之用。具体方法如下:

函数指针

现来看看以下声明语句,看看其含义:

float (*h(int, void (*)(int)))(int);

以下是一个变量指针的定义语句:

float* pf;

以下是一个普通函数的声明语句:

float f();

请看以下声明语句:

float* g();

因为()的优先级高于*, 所以相当于:

float* (g());

g是一个函数, 返回值为float*, 参数为void

float (*h)();

中, h是个指针, 指向一个返回值为float的函数.
去掉h, 就是h的类型:

float (*)();

若要调用h所指的函数, 解引用这个指针即可:

(*h)();

它的缩写为(注意, 仅仅是缩写):h();
注意不能将(*h)两边的括号去掉, 去掉后,*h()等价于*(h()). ANSI C会把它认为是以下语句的缩写:

*((*h)());

上面的语句表示: 执行h所指向的函数, 然后解引用函数的返回值.
若h指向的函数有参数, 参数是指向函数的指针呢? 假设该参数的类型为: void (*)(int), 则h可以声明为:

float (*h)(void(*)(int));

已知有以下函数的声明:

float func(int);

若要使h指向函数func, 只需要将(*h)替换func即可:

float (*h)(int);

更进一步, h所指的函数不返回float, 而是返回指向函数的指针呢? 该指针的类型为float(*)(int).

float (*h(parameter))(int);

其中parameter为h所指函数的参数, 假设参数类型有两个, 一个为int型, 一个类型为: void (*)(int), 则最终的结果为:

float (*h(int, void (*)(int)))(int);

希望本文所述对大家的C++程序设计有所帮助。

(0)

相关推荐

  • C++中Semaphore内核对象用法实例

    本文实例讲述了C++中Semaphore内核对象的用法,分享给大家供大家参考.具体方法如下: 复制代码 代码如下: // Semaphore.cpp : 定义控制台应用程序的入口点.  //    #include "stdafx.h"  #include <Windows.h>  #include <process.h>     HANDLE g_hSemaphore;  DWORD g_nConut1 = 0;  DWORD g_nConut2 = 0; 

  • C++友元(Friend)用法实例简介

    相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴.希望能对初学C++的朋友起到一点帮助作用. 操作步骤: 1)在MyFriend类中,将Father类定义成友元 2)写一个Son类继承自Father类 3)在Father类和Son类的构造函数中分别创建MyFriend对象,并定义其内部的三个变量 4)在MyFriend类的构造函数中创建Father对象,并定义其内部的三个变量 结果

  • C++中DeviceIoCteatol的用法实例

    本文是一篇译文,主要以实例形式讲述了C++中DeviceIoCteatol的用法.分享给大家供大家参考.具体方法如下: 应用程序代码如下: 复制代码 代码如下: DWORD dwBytesReturned = 0;      BYTE bytBuffer_1[512];      BYTE bytBuffer_2[512];      CHAR string[2048];      HANDLE hDevice, hDriver;      BOOL bRet;  bRet = DeviceIo

  • 浅析C/C++中sort函数的用法

    sort是STL中提供的算法,头文件为#include<algorithm>以及using namespace std; 函数原型如下: template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare> void sor

  • C++之boost::array的用法

    本文实例讲述了C++之boost::array的用法,分享给大家供大家参考.具体如下: 复制代码 代码如下: #include <string>  #include <iostream>  #include <boost/array.hpp>  #include <algorithm>  using namespace std;  int main()  {      boost::array<int, 5> array_temp = {{12,

  • C++采用openfilename打开文件对话框用法实例

    本文实例讲述了C++采用openfilename打开文件对话框用法,分享给大家供大家参考.具体方法如下: 这里需要注意,有的时候会因为没设置nMaxFile,而一直不出现对话框. 具体功能代码如下: 复制代码 代码如下: char szFileName[MAX_PATH]={0};  OPENFILENAME openFileName = {0};  openFileName.lStructSize = sizeof(OPENFILENAME);  openFileName.nMaxFile =

  • C++位操作的常见用法小结

    本文以实例形式对C++位操作的常见用法进行了总结.分享给大家供大家参考之用.具体方法如下: 在C++中位操作有6种基本操作符,按照优先级分别是: 取反   - 移位   <<  >> 与      & 异或   ^ 或      | 常用的用法有: 1 判断偶数,判断最低位是0还是1即可,比求模快 x % 2 != 0 //x正负都可以判断:不用x%2 == 1,因为如果x为负奇数,x%2=-1 x & 0x1 == 0 2 交换两个数,不用中间变量 void my

  • C++模板类的用法

    本文实例讲述了C++模板类的用法,分享给大家供大家参考.具体实现方法如下: main.h头文件如下: 复制代码 代码如下: template <class T>  class actioncontainer  {  public:      //构造函数      actioncontainer()      {          m_nRedoPos = 0;          m_nUndoPos = 0;      }      //容器的接口函数      void add(T val

  • C++类中的static和const用法实例教程

    static和const是C++程序设计中非常重要的概念,本文实例列举了C++类中的static和const的规则和用法.供大家参考借鉴.具体说明如下: 首先以代码用来举例说明.示例代码如下: class A { public: A():m(10) //const成员必须在构造函数的初始化构造列表中初始化 { q = 40; } void fun1()const { m++; //错误.const成员是常量,不能改变其值. n++; //正确.static变量n属于类,但是每个对象的函数都可以访

  • C++中extern "C"的用法

    学习过C++的人都知道,extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.这里起到的是声明作用范围的用处.另外,extern还可以与"C"连用,作为链接指示.本文就此进行实例说明如下: 一.C++名字修饰(Name Mangling) 首先需要从C++的重载说起,在C++中函数重载指的是几个函数的函数名相同,参数列表不同.那么当生成obj中间文件/目标文件的时候,C++编译器如何区分这几个重载函数呢?可以

  • C++采用TLS线程局部存储的用法实例

    本文实例讲述了C++采用TLS线程局部存储的用法.分享给大家供大家参考. 具体方法如下: 复制代码 代码如下: // useTLS.cpp : 定义控制台应用程序的入口点.  //    #include "stdafx.h"  #include <Windows.h>  #include <process.h>    //声明  VOID InitStartTime();  DWORD GetUserTime();    //TLS索引,作全局变量   DWO

  • C++模板类的用法实例

    本文实例讲述了C++中模板类的用法,分享给大家供大家参考.具体方法如下: //#include "StdAfx.h #ifndef __AFXTLS_H__ #define __AFXTLS_H__ #include <Windows.h> class CSimpleList { public: CSimpleList(int nNextOffset=0); void Construct(int nNextOffset); //接口 BOOL IsEmpty() const; voi

随机推荐