zoukankan      html  css  js  c++  java
  • C++ 函数指针2

    对于以下三个函数

    const double *f1(const double ar[],int n)

    const double *f2(const double [],int n)

    const double *f3(const double* ,int n)

    第一个参数虽然是三种形式, 但是表达的都是一种意思, 因此

    可以使用一个函数指针的数组来同时存储这三个函数的指针

    和之前的方法一样, 将函数原型的函数名, 改为 (*pf) , 注意指针数组方括号的位置,

    如果位置不对, 没有加括号, 就会导致意义有偏差.  因为 [] 运算符 的优先局 大于 * 

    const double *(*pf[3] )(const double* ,int n) = {f1, f2, f3}

    注意:

    虽然左边的数组看起来很复杂, 但是不能够使用auto 关键字让编译器自行推断类型, 

    因为auto 只能用于单值初始化, 不能用于列表初始化.

    但是当pf 确定之后, 就可以使用auto 关键字了:

    auto pa = pf

    当有了数组之后, 数组中的每个元素都指向一个函数 , 所以可以按以下方式调用:

    pa[0](3.14,3)  或者  *(pa[1])(3.14,3) 

    因为要函数原型返回的是 double *类型的数据, 所以, 想取得返回值, 可以在外面再加一个 * 号 解引用

    double x= *pa[0] ( 3.14, 3)

    可以做的另一件事是, 创建一个指向数组的指针,  即指针的指针, 双重指针, 这个双重指针的地址为, 含有三个函数指针的数组 的地址;

    虽然听起来很复杂, 但是因为满足单值初始化的条件, 所以可以用auto 关键字自行推断

    auto pc = &pa;

    则此时, 从双重指针中调用函数的代码就变为

    (*pc)[0](3.14,3)

    如果把 auto 拆开来看, 他的原型应该如下:

    const double *(*(*pd)[3]) (const double *, int ) = &pa;

    很复杂, 有三个*号, 一个一个来看

    最左边的*号, 意思是声明指针的原型是double * 类型, 所以最左边的 * 和double 解释在了一起. 意为函数返回值是double * 类型

    左边第三个*号, 意思是 声明了一个长度为3 的数组, 数组的内容存放的是函数的指针.

    左边第二个*号, 意思是一个指针, 指向了一个数组.

    再次强调 &pa 和pa 的不同

    假设pa 是一个数组名

    &pa 代表着整个数组的起始地址

    pa 代表第一个元素的地址

    虽然值一样 但是pa +1 和&pa +1 却有很大区别

    另一个区别体现在

    要得到第一个元素的值, 

    **&pa== *pa = pa[0]

  • 相关阅读:
    eclipse安装Genymotion插件
    [Eclipse插件] 安装和使用JD-Eclipse插件
    [Eclipse插件] Eclipse中如何安装和使用GrepCode插件
    [Android Studio] Android Studio如何删除module(转载)
    前端html基本标签
    python实现简单FTP
    文件的md5计算
    suprocess模块
    几个小例子
    configparser模块
  • 原文地址:https://www.cnblogs.com/derek-dhw/p/10451015.html
Copyright © 2011-2022 走看看