曾经在书上看到函数指针相关的都没怎么重视。可是近期在实际的工作中却派上了用场。所以认真地学习了一遍。

函数指针的申明

申明一个函数指针非常easy,就是将函数申明中的函数名替换为一个指针就可以:

C/C++
int test(int para1, double *para2); // 函数申明
int (*pf)(int para1, double *para2); // 函数指针申明

NOTE: 必须在申明中用括号将*pf括起来,由于括号的优先级比*运算符高。因此:

C/C++
int (*pf)(int para1, double *para2); // 一个指向函数的指针
int *pf(int para1, double *para2); // 一个返回指针的函数

申明完函数指针的下一步就是对函数指针赋值。也就是将函数指针指向一个类型匹配的函数(这跟基本类型的指针一致),一个函数的函数名就是该函数的地址

C/C++
pf = test;
int (*pf1)(int para1, double *para2) = test; // 也能够在函数指针申明时完毕初始化

C++11有了自己主动类型判断功能,就简单了非常多:

C++11 code
auto pf = test;

使用函数指针调用函数

(*pf)扮演的角色与函数名同样,因此使用(*pf)时,仅仅须要将它看做函数名就可以:

C/C++
int n = 0;
double d = 0.0;
int r = 0;
r = (*pf)(n, &d);
r = pf(n, &d); // 这样的方式C/C++也是同意的

函数指针数组

我们有可能还须要用到函数指针数组。示比例如以下:

C/C++
int test1(int para1, double *para2); // 函数申明
int test2(int para1, double *para2); // 函数申明
int test3(int para1, double *para2); // 函数申明 int (*pfArray[3])(int para1, double *para2) = {test1, test2, test3}; // 函数指针数组申明及初始化
r = *pfArray[0](n, &d); // 函数调用

能够看到这样的方式使用函数指针是比較麻烦的。试想假设上面的函数返回值是const指针,而我们又想将函数指针数组申明为不可更改的,那这个const应该加到哪?这里提供另外一个比較简单的解决方法,也就是以下将要说到的使用typedef进行简化。

使用typedef进行简化

C/C++
typedef int (*p_fun)(int para1, double *para2); // 这样我们就能像使用一个普通类型那样来使用函数指针了
p_fun pf = test;
const p_fun pf1 = test; // 常量函数指针申明及初始化,注意跟一般的const数据类型一样。常量函数指针必须在申明时完毕初始化
p_fun pfArray[3] = {test1, test2, test3};
const p_fun pfArray1[3] = {test1, test2, test3}; // 常量函数指针数组申明及初始化

It's that easy!


參考书籍:《C++ Primer Plus (第6版)中文版》

C/C++学习:函数指针的更多相关文章

  1. 函数指针的应用学习Demo

    学习函数指针的应用 ,简单demo #include "stdafx.h" #include "SubClass.h"; //函数指针 typedef int ...

  2. iOS学习09C语言函数指针

    本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...

  3. C++学习之函数指针

     C++学习之函数指针          和数据项类似,函数也有地址,函数的地址是存储在机器语言代码的内存的开始地址.通常,这些地址对用户而言,不重要也没什么用处,但对程序而言,它却很有用. 一.函数 ...

  4. C++学习之普通函数指针与成员函数指针

    函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...

  5. [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good

    [C++学习笔记14]动态创建对象   C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...

  6. C语言学习019:函数指针

    在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函 ...

  7. iOS学习之C语言函数指针

    通过函数名调用函数: int max = maxValue(4, 5); printf("max = %d\n", max);     函数类型:int (int, int) 1. ...

  8. C++学习笔记之函数指针

    与数据项类似,函数也有地址.函数的地址是存储其机器语言代码的内存开始的地方. 一.函数指针的基础知识 假设要设计一个名为estimate()的函数,估算编写指定行数代码所需时间,并且希望不同的程序员都 ...

  9. C++学习笔记(八):函数重载、函数指针和函数对象

    函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...

随机推荐

  1. C# 数组动态添加新元素的 方法

    经常在开发中  会对字符串 进行split 拆分操作.. 得到数组后再去做相应的事情! 但有时候,需求决定了 数组的长度 不是固定的, 而C# 数组 是不允许动态添加新的元素的.. 这事情让我也纠结了 ...

  2. js判读周末以及节假日

    两个链接,搞定! http://bbs.csdn.net/topics/10417668 http://www.jb51.net/article/131660.htm

  3. POJ 1442 Treap模板

    // by SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using na ...

  4. 通过阅读《React 进阶之路》之学习笔记

    第一章: React 通过引入虚拟DOM.状态.单向数据流等设计理念,形成以组件为核心,用组件搭建UI的开发模式.

  5. html中map标签和area标签的应用

    map标签的用途:是与img标签绑定使用的,常被用来赋予给客户端图像某处区域特殊的含义,点击该区域可跳转到新的文档. 因为map标签是与img标签绑定使用的,所以我们需要给map标签添加ID和name ...

  6. nodejs -- crypto MD5签名

    MD5使用方法: const crypto = require('crypto'); var obj = crypto.createHash('md5'); // 可多次调用 update obj.u ...

  7. 将mysql默认编码改为UTF8

    windows: a. WIN+R  net stop mysql  关闭mysql服务 b. 复制my-dafault.ini,重命名为my.ini,进入里面 UBUNTU: ** sudo vim ...

  8. winform右键菜单

    public partial class Form1 : Form { ContextMenuStrip cms; Bitmap bm ; public Form1() { InitializeCom ...

  9. java学习笔记5——String类常用方法

    1.字符串长度计算: int i = String1.length(); 2.字符串比较:1) equals()和equalsIgnoreCase //比较两个字符串对象的实体是否相同,相同输出tru ...

  10. 文字横向滚动marquee

    <div style="width:200px; height:300px"> <marquee behavior="scroll" cont ...