程序员人生 网站导航

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

栏目:互联网时间:2014-11-18 08:54:54

之前在书上看到函数指针相干的都没怎样重视,但是最近在实际的工作中却派上了用处。所以认真地学习了1遍。

函数指针的申明

申明1个函数指针很简单,就是将函数申明中的函数名替换为1个指针便可:

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

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

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

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

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应当加到哪?这里提供另外1个比较简单的解决方法,也就是下面将要说到的使用typedef进行简化

使用typedef进行简化

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

It's that easy!


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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐