C/C++学习:函数指针
曾经在书上看到函数指针相关的都没怎么重视。可是近期在实际的工作中却派上了用场。所以认真地学习了一遍。
函数指针的申明
申明一个函数指针非常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 codeauto 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++学习:函数指针的更多相关文章
- 函数指针的应用学习Demo
学习函数指针的应用 ,简单demo #include "stdafx.h" #include "SubClass.h"; //函数指针 typedef int ...
- iOS学习09C语言函数指针
本次主要学习和理解函数指针 1.函数指针 void printValue(int number) { printf("number = %d\n", number); } int ...
- C++学习之函数指针
C++学习之函数指针 和数据项类似,函数也有地址,函数的地址是存储在机器语言代码的内存的开始地址.通常,这些地址对用户而言,不重要也没什么用处,但对程序而言,它却很有用. 一.函数 ...
- C++学习之普通函数指针与成员函数指针
函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般函数的函数指针使用的比较多,而对指向类成员函数的函数指针则比较陌生.我最近也被问到了这方面的问题,心中 ...
- [C++学习笔记14]动态创建对象(定义静态方法实现在map查找具体类名对应的创建函数,并返回函数指针,map真是一个万能类)good
[C++学习笔记14]动态创建对象 C#/Java中的反射机制 动态获取类型信息(方法与属性) 动态创建对象 动态调用对象的方法 动态操作对象的属性 前提:需要给每个类添加元数据 动态创建对象 实 ...
- C语言学习019:函数指针
在C语言中,函数名也是指针变量,比如创建了一个add(int n,int m)的函数的同时也创建了一个名为add的指针变量,因此我们可以把函数指针当作一种类型为它赋值.当作参数传递等操作 C语言创建函 ...
- iOS学习之C语言函数指针
通过函数名调用函数: int max = maxValue(4, 5); printf("max = %d\n", max); 函数类型:int (int, int) 1. ...
- C++学习笔记之函数指针
与数据项类似,函数也有地址.函数的地址是存储其机器语言代码的内存开始的地方. 一.函数指针的基础知识 假设要设计一个名为estimate()的函数,估算编写指定行数代码所需时间,并且希望不同的程序员都 ...
- C++学习笔记(八):函数重载、函数指针和函数对象
函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...
随机推荐
- 学习笔记:javascript中的Generator函数
最近在学习redux-saga,由于redux-saga需要使用Generator函数,所以下来就回顾了一下Generator Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为 ...
- LVS十种调度算法介绍
1.轮叫调度(Round Robin)(简称rr) 轮叫调度(Round Robin Scheduling)算法就是以轮叫的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod ...
- Android 低功耗蓝牙的多设备连接与数据接收,简单实现
在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...
- 洛谷P1208 [USACO1.3]混合牛奶 Mixing Milk(贪心)
题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助Marry乳业找到最优的牛奶采购方案. Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是 ...
- vue中子组件需调用父组件通过异步获取的数据
原因:子组件需要调用父组件传过来的数据,如果这个数据是异步从接口里取的,那这个组件在任何生命周期里都取不到,而应该在接口调取后取到. 需要在msg拿到值后才调用组件,然后你在生命周期created里面 ...
- java中参数传递实例
//在函数中传递基本数据类型, 2. public class Test { 4. public static void change(int i, in ...
- vs2012下 error4996
原文链接:http://blog.csdn.net/xidianzhimeng/article/details/11457045 分类: VS使用学习 2013-09-09 08:37 24人阅读 评 ...
- MFC多标签页对话框
原文链接(有修改):http://blog.sina.com.cn/s/blog_6a1cdb3f0101llcw.html 1.新建一个MFC工程 取名PageSheet,选择Dialog base ...
- day02_20190106 基础数据类型 编码 运算符
一.格式化输出 name = input('请输入姓名') age = input('请输入年龄') hobby = input('请输入爱好') job = input('请输入你的工作') # m ...
- 主题:实战WebService II: SOAP篇(基于php)
概述(SOAP和XML-PRC比较) 在Web服务发展的初期,XML格式化消息的第一个主要用途是,应用于XML-RPC协议,其中RPC代表远程过程调用.在XML远程过程调用 (XML-RPC)中,客户 ...