您的位置:首页 > 编程语言 > C语言/C++

C/C++学习:函数指针

2014-10-30 13:00 274 查看
以前在书上看到函数指针相关的都没怎么重视,但是最近在实际的工作中却派上了用场。所以认真地学习了一遍。


函数指针的申明

申明一个函数指针很简单,就是将函数申明中的函数名替换为一个指针即可:
C/C++[code]int test(int para1, double *para2); // 函数申明
int (*pf)(int para1, double *para2); // 函数指针申明


NOTE: 必须在申明中用括号将
*pf
括起来,因为括号的优先级比
*
运算符高,因此:
C/C++[code]int (*pf)(int para1, double *para2); // 一个指向函数的指针
int *pf(int para1, double *para2); // 一个返回指针的函数


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

C/C++[code]pf = test;
int (*pf1)(int para1, double *para2) = test; // 也可以在函数指针申明时完成初始化


C++11有了自动类型推断功能,就简单了很多:
C++11 code[code]auto pf = test;


使用函数指针调用函数

(*pf)
扮演的角色与函数名相同,因此使用
(*pf)
时,只需要将它看做函数名即可:
C/C++[code]int n = 0;
double d = 0.0;
int r = 0;
r = (*pf)(n, &d);
r = pf(n, &d); // 这种方式C/C++也是允许的


函数指针数组

我们有可能还需要用到函数指针数组,示例如下:
C/C++[code]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++[code]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版)中文版》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: