zoukankan      html  css  js  c++  java
  • 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 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应该加到哪?这里提供另外一个比較简单的解决方法,也就是以下将要说到的使用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版)中文版》

  • 相关阅读:
    随机生成30道四则运算题目
    《构建之法》阅读笔记01
    第一周学习进度
    个人介绍
    MyBatis(登录)
    MyBatis
    动态网页
    网页基本标签
    Servlet基础
    JSP数据交互
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7019751.html
Copyright © 2011-2022 走看看