• 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中项目去除Js验证
    Web安全扫描工具
    Oracle-定时任务
    About_Return
    About_php_封装函数
    About_PHP_函数
    About_PHP_验证码的生成
    About_PHP_文件的上传
    About_MySQL Select--来自copy_03
    About_AJAX_03
  • 原文地址:https://www.cnblogs.com/derek-dhw/p/10451015.html
Copyright © 2020-2023  润新知