C基础--函数指针的使用
之前在看代码的时候,看了函数指针的使用,大体分为如下几类:
- 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰;
- 函数指针作为另一个函数的参数,用作回调;
- linux中经常使用来达到相同接口,实现不同,如:
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
bool prevent_deferred_probe;
};
实现可以是freescale的imx系列芯片的串口:
static struct platform_driver serial_imx_driver = {
.probe = serial_imx_probe,
.remove = __devexit_p(serial_imx_remove), .suspend = serial_imx_suspend,
.resume = serial_imx_resume,
.id_table = imx_uart_devtype,
.driver = {
.name = "imx-uart",
.owner = THIS_MODULE,
.of_match_table = imx_uart_dt_ids,
},
};
下面摘自一个博客:
转自:http://blog.sina.com.cn/s/blog_4d48cc5d0100xnh9.html
用途:
函数指针通常用来实现回调,也可以用来对模块调用以函数表的形式进行优化。
使用方法:
1、定义函数指针类型
使用typedef更直观更方便
// 定义一个原型为int Fun( int a );的函数指针
typedef int (*PTRFUN) ( int aPara );
typedef的功能是定义新的类型。这里定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
2、函数指针变量的定义
PTRFUN pFun; // pFun 为函数指针变量名
int (*pFun2) ( int a ); // pFun2也是函数指针变量名
3、函数指针作为函数的参数传递
// 定义回调函数
int CallBack( int a )
{
return ++a;
} // 定义回调者函数
void Caller( PTRFUN cb ) // void Caller( int (*cb) ( int ) ) // 也可这样申明
{
int nPara = ;
int nRet = cb( nPara );
} // 使用回调
void main()
{
Caller( CallBack ); // 直接使用回调函数
PTRFUN cb = CallBack; // int (*cb) ( int ); cb = CallBack;
int nRet1 = cb( ); // nRet1 = 100;
}
4、函数指针的指针使用
// 定义函数指针的指针
typedef int (**PTRPTRFUN) ( int aPara ); // 函数指针的指针作为参数
// void PtrCaller( PTRFUN* cb ) // 指针申明
// void PtrCaller( int (**cb) ( int ) ) // 原型申明
void PtrCaller( PTRPTRFUN cb )
{
int nRet = (*cb)(); // nRet = 1000;
} // 使用函数指针的指针
void main()
{
PTRFUN cb = CallBack;
PtrCaller( &cb );
}
5、函数指针数组的使用
// 函数指针数组的定义
PTRFUN fArray[]
// int (*fArray[10]) ( int ); // 原型定义
for ( int i = ; i < ; i++ )
{
fArray[i] = CallBack;
int nRet = fArray[i](i); // nRet = i+1;
}
6、函数指针的大小
既然叫指针,所以跟普通的指针一样在32位系统下大小都为4
int nSz1 = sizeof(PTRFUN); // nSz1 = 4;
int nSz2 = sizeof(PTRPTRFUN); // nSz2 = 4;
使用实例:
这里给出一个使用函数指针的简单例子:
//------------------------------------------------------
#include <stdio.h> typedef int (*PTRFUN) ( int aPara , int bPara); int func1(int Pa, int Pb);
int func2(int Pa, int Pb);
int func3(int Pa, int Pb);
int func4(int Pa, int Pb); void main()
{
int i = ;
int j = ;
PTRFUN pFuncArray[] = {func1, func2, func3, func4};
PTRFUN pFunc; for(i = ; i >= ; i --)
{
pFunc = pFuncArray[i];
printf("Output is: %d \n", (*pFunc)(i,i));
}
} int func1(int Pa, int Pb)
{
printf("func1 with input para %d, %d \n", Pa, Pb);
return Pa + Pb;
} int func2(int Pa, int Pb)
{
printf("func2 with input para %d, %d \n", Pa, Pb);
return Pa - Pb;
} int func3(int Pa, int Pb)
{
printf("func3 with input para %d, %d \n", Pa, Pb);
return Pa * Pb;
} int func4(int Pa, int Pb)
{
printf("func4 with input para %d, %d \n", Pa, Pb);
return (Pb == )? 0xffff : (Pa / Pb);
}
输出为:
func4 with input para ,
Output is: func3 with input para ,
Output is: func2 with input para ,
Output is: func1 with input para ,
Output is:
C基础--函数指针的使用的更多相关文章
- C++基础——函数指针 函数指针数组
==================================声明================================== 本文版权归作者所有. 本文原创,转载必须在正文中显要地注明 ...
- C语言基础:函数指针 分类: iOS学习 c语言基础 2015-06-10 21:55 15人阅读 评论(0) 收藏
函数指针:指向函数的指针变量. 函数名相当于首地址. 函数指针定义:返回值类型 (*函数指针变量名)(参数类型1,参数类型2,....)=初始值 函数指针类型:返回值类型 (*)(参数类型1,参数 ...
- C语言函数指针基础
本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...
- 小猪猪C++笔记基础篇(六)参数传递、函数重载、函数指针、调试帮助
小猪猪C++笔记基础篇(六) ————参数传递.函数重载.函数指针.调试帮助 关键词:参数传递.函数重载.函数指针.调试帮助 因为一些事情以及自己的懒惰,大概有一个星期没有继续读书了,已经不行了,赶紧 ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...
- day11基础代码——函数指针
// // main.m // Demo11 // // Created by scjy on 15/10/29. // Copyright © 2015年 lizhipeng. All ri ...
- c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
1. 引用本身是有指针实现的:引用为只读指针 例子: int d=123; int& e=d; //引用 int * const e=d; //只读指针,e指向d,不可修改e指 ...
- C++学习基础十七-- 函数指针
C++常用的函数指针 语法:返回值类型 (*函数名)(参数列表); 举例说明:int (*Func)(int m, int n); 用typedef简化函数指针的定义 例如: typedef int ...
- C/C++基础知识:函数指针和指针函数的基本概念
[函数指针] 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址.可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指 ...
随机推荐
- 学习Linux——计算机概论
一直想学习Linux,但计划时不时被耽误,现在开始,决定每天开始学习Linux.学习从最简单的开始,一步步,不能将最简单的东西忽略. 1.计算机硬件的五大单元 计算机分为三部分:输入单元,中央处理器即 ...
- H5标签-canvas实现颜色拾取功能
HTML5 <canvas> 标签是用于绘制图像,不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器),必须使用脚本(通常是 JS)来完成实际的绘图任务. &l ...
- C++ Primer : 第二章:变量和基本类型(1)
变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...
- hdu1059 Dividing ——多重背包
link:http://acm.hdu.edu.cn/showproblem.php?pid=1059 最简单的那种 #include <iostream> #include <cs ...
- HDU-1520 Anniversary party(树形DP)
题目大意:一棵树,每个节点都带权.从中取出一些节点,并且子节点不能与父节点同时取,求能取得的最大值. 题目分析:定义状态dp(u,0/1)表示u点不取/取.则状态转移方程为: dp(u,1)=sum( ...
- java编程之:按位与运算,等运算规则
按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算. 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:两位 ...
- 【HACK】破解APK并注入自己的代码
请不要去干坏事! 使用工具: APKTool 提醒:能够正常安装到手机上的APK都是带有签名的(不了解签名的可以百度),APK在破解重新打包后是已经不再拥有签名的,如果想要你破解后的APK能够正常运行 ...
- rman的使用
下面是两种连接方式[oracle@oracle3A ~]$ rman target/ Recovery Manager: Release 11.2.0.1.0 - Production on Mon ...
- noip2014普及组——珠心算测验
题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师采用一种快速考察珠 ...
- OpenJudge计算概论-求平均年龄
/*============================================== 求平均年龄 总时间限制: 1000ms 内存限制: 65536kB 描述 班上有学生若干名,给出每名学 ...