zoukankan      html  css  js  c++  java
  • [置顶] 函数指针与返回函数的指针

    先看看以下两个代码:

    1:出自STL-SGI源码<stl_alloc.h>

      static void (* __set_malloc_handler(void (*__f)()))()
      {
        void (* __old)() = __malloc_alloc_oom_handler;
        __malloc_alloc_oom_handler = __f;
        return(__old);
      }

    2:Linux下的<sginal.h>

    void (*signal (int sig_num, void (*handler)(int))) (int) 

    作为一个C/C++高手也许一看就明白,下面来分析一下,分析的方法采用的是从里向外的分析法

    对于例子1分析如下:

    1)最里面是void (*_f)()说明_f是一个指针,与右边的()结合,说明其是一个函数,在与最左边的void结合,表明其是一个函数指针。

    2)用typedef对void (*_f)()进行一下定义,方便后面的分析

    Typedef void (*F)()
     

    3)于是上面的代码可以变成如下的形式

    Static void (*__set_malloc_handler(F f))()

    4)再从里向外分析__set_malloc_handler(F f)先与()结合表明其是一个函数,参数类型为F f,再于左边的*结合,表明函数返回的是一个指针类型,即static void (*)(),因此是一个函数指针

    1)综上可以得到代码函数名为__set_malloc_handler,接受一个返回值为空,参数为空的函数指针作为参数,最后返回一个函数指针,该指针同样返回值与参数均为空,很绕口:)

    对于例子2分析如下

    1)从里向外里面是void (* handler)(int)看过列子1,很容易知道这是一个函数指针,返回值为空,参数为空

    2)对void (*handler)(int)进行宏定义,以方便理解

    Typedef void (*Handle)(int)

    3)于是函数就变成了void (*signal(int sig_num,Handler handler))(int)

    4)从里向外分析signal(int sig_num,Handler handler)是一个函数,带两个参数,返回值是*,即是一个指针,返回值为void(*)(int)同样是一个Handler类型的函数指针

    5)综上所述,代码2的函数名是signal,接受两个参数,返回一个Handler类型的函数指针。

    其他代码的分析类似,如下几例:

    1:void *(*(*f)(int))[10];

    分析如下(*(*f)(int)->void *(*)[10]

    2:void *(*f)(int)[10]

    分析如下(*f)(int)->void *[10]

    还有一些基本上都是类似的变形

  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3165454.html
Copyright © 2011-2022 走看看