当前位置:  编程技术>c/c++/嵌入式

深入解析函数指针与返回函数的指针

    来源: 互联网  发布时间:2014-10-18

    本文导语:  先看看以下两个代码:1:出自STL-SGI源码 代码如下:static void (*__set_malloc_handler(void (*__f)()))(){ void (*__old)()=__malloc_alloc_oom_handler; __malloc_alloc_oom_handler=__f; return (__old);}2:Linux下的 代码如下:void (*signal (int sig_num, void (*handler)(int))) (int)...

先看看以下两个代码:
1:出自STL-SGI源码

代码如下:

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

2:Linux下的
代码如下:

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 (*)(),因此是一个函数指针

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

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

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

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

4)从里向外分析signal(int sig_num,Handlerhandler)是一个函数,带两个参数,返回值是*,即是一个指针,返回值为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]

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

    
 
 

您可能感兴趣的文章:

  • 深入理解数组指针与指针数组的区别
  • 深入解析C++中的指针数组与指向指针的指针
  • 数组和指针的区别深入剖析
  • 数组指针、指针数组以及二位数组的深入解析
  • 基于C语言中野指针的深入解析
  • 一般函数指针和类的成员函数指针深入解析
  • 深入const int *p与int * const p的区别详解(常量指针与指向常量的指针)
  • 深入理解双指针的两种用法
  • 深入理解void以及void指针的含义
  • 二维指针动态分配内存连续问题深入分析
  • 深入理解C语言 static、extern与指针函数
  • 深入分析C语言中结构体指针的定义与引用详解
  • C语言指针的长度和类型深入分析
  • C++ 智能指针深入解析
  • C/C++中指针和引用之相关问题深入研究
  • 深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解
  • 内联函数inline与宏定义深入解析
  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析
  • SQL SERVER函数之深入表值函数的处理分析
  • 深入探讨:main函数执行完毕后,是否可能会再执行一段代码?
  • 基于memset()函数的深入理解
  • C语言typedef与复杂函数声明问题的深入解析
  • 深入VC回调函数的使用详解
  • strcat函数与strncat函数的深入分析
  • 深入Main函数中的参数argc,argv的使用详解
  • 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
  • 深入解析C++中的构造函数和析构函数
  • MySQL中group_concat函数深入理解
  • 基于Mysql的IP处理函数inet_aton()与inet_ntoa()的深入分析
  • C++函数参数取默认值的深入详解
  • 解析VC中创建DLL,导出全局变量,函数和类的深入分析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 深入解析C中的数值与真假
  • c/c++中变量的声明和定义深入解析
  • 深入解析C语言中常数的数据类型
  • 深入解析mysql中order by与group by的顺序问题
  • 深入解析Linux下MySQL数据库的备份与还原
  • 基于android中读取assets目录下a.txt文件并进行解析的深入分析
  • 深入解析StringBuffer和StringBuilder的区别
  • c++关键字mutable深入解析
  • 深入解析Oracle参数及参数文件
  • Grow heap (frag case) 堆内存过大的深入解析
  • 深入解析mysql.sock不见的问题
  • 引用参数和传值参数的区别深入解析
  • Android中asset文件夹与raw文件夹的区别深入解析
  • EditText属性深入解析
  • 深入解析int(*p)[]和int(**p)[]
  • [Oracle] RAC 之 - 负载均衡深入解析
  • C#中IList<T>与List<T>的区别深入解析
  • 深入解析System.load 与 System.loadLibrary
  • C# interface与delegate效能比较的深入解析
  • PHP中redis的用法深入解析
  • 深入分析C语言中结构体指针的定义与引用详解 iis7站长之家
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3