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++学习笔记(八):函数重载、函数指针和函数对象
函数重载 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于 ...
随机推荐
- Linux Shell Scripting Cookbook 读书笔记 2
cat,script,find, xargs, tr, tmp文件,字符串截取,批量文件重命名,固定大小文件,自动化交互 1. cat的用法 压缩连续的空白行 cat -s file 也可以用tr,将 ...
- 强连通分量的模版 Kosaraju+Tarjan+Garbow
PS:在贴出代码之前,我得说明内容来源——哈尔滨工业大学出版的<图论及应用>.虽然有一些错误的地方,但是不得不说是初学者该用的书. 从效率的角度来说,Kosaraju <Tarjan ...
- 小米 SOAR 开源SQL优化工具安装
github :https://github.com/xiaomi/soar 安装说明 :https://github.com/XiaoMi/soar/blob/master/doc/install. ...
- sublime text 3 上安装xdebug
安装完成之后启动xdebug,缺省设置下会显示warning等信息,很不方便. 可以参考 https://github.com/martomo/SublimeTextXdebug/blob/maste ...
- OpenCV_Python教程 系列!
这个是作者的总结系列!赞一个! 原文链接:http://blog.csdn.net/sunny2038/article/details/9057415 在python中使用OpenCV:http:// ...
- RabbitMQ学习之spring配置文件rabbit标签的使用
下面我们通过一个实例看一下rabbit的使用. 1.实现一个消息监听器ReceiveMessageListener.Java package org.springframework.amqp.core ...
- 后代children() find()的区别
$(document).ready(function(){ $("div").children(); });只拿到div下面的子标签元素 $(document).ready(fun ...
- 使用***客户端和Privoxy让所有CentOS 7命令行工具通过代理访问互联网(转载)
安装*** 首先安装pip: curl -LO "https://bootstrap.pypa.io/get-pip.py" python get-pip.py 通过pip安装** ...
- 自我介绍About me
我的github:www.github.com/dcdcbigbig 欢迎来加star!(雾) tm就是个菜逼
- JavaScript进阶【二】JavaScript 严格模式(use strict)的使用
/*** *使用严格模式的原因: * ①:消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; ②:消除代码运行的一些不安全之处,保证代码运行的安全: ③:提高编译器效率,增加运行 ...