1.显示调用首地址为0的例程:(*(void(*)())0)()

显示调用首地址为0的例程的表达式为:(*(void(*)())0)()

分两步分析:

  1. 假定变量fp是一个函数指针,调用方法如下:(*fp)();

因为fp是一个函数指针,那么*fp就是该指针指向的函数,所以(*fp)()就是调用该函数的方式。ANSI C标准允许程序员将上式简写为fp()。()的运算符高于*。

  2.使用具体的函数指针替换fp,此处将0做类型强制转换,转换为函数指针,替换fp。

对一个常数进行类型转换,只需在变量声明中将变量名去掉即可。如果fp是一个指向返回值为void类型的函数的指针,那么(*fp)()的值为void,fp的声明如下:

void (*fp)();将变量名去掉,将0转换为"指向返回值为void的函数的指针"类型这样写:(void(*)())0

因此,可以用(void(*)())0替换fp,从而得到:

(*(void(*)())0)();

使用typedef声明更加便于理解。

typedef void(*funcptr)();     //相当于typedef void (*)()  funcptr

((*funcptr)0)();

2.signal函数声明理解:void(*signal(int, void(*)(int)))(int)

从三个方面理解:返回值类型、函数指针以及参数。

signal函数的返回值类型是一个指向调用前的用户定义信号处理函数的指针,

假定特定信号处理函数的声明如下:

void sigfunc(int);

假定sfp为指向sigfunc的函数指针,则*sfp就代表了sigfunc函数,因此可以如下声明sfp:

void (*sfp)(int);

signal的参数列表是(int,sigfunc), 返回值是sigfunc,所以signal可以声明如下:

sigfunc signal(int, sigfunc)

替换sigfunc,即:void(*sfp)(int) signal(int, void(*sfp)(int))

去掉变量名,即:void (*)(int) signal(int, void(*)(int))

调顺序,即:void (*signal(int, void(*)(int)))(int)

使用typedef声明更加便于理解。

typedef void (*HANDLER) (int);

HANDLER signal (int, HANDLER);

理解函数声明--signal函数的声明的更多相关文章

  1. 如何理解signal函数声明

    Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解.自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下. 先看函数原型:void (*signal(i ...

  2. 简单理解函数声明(以signal函数为例)

    这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考<c陷阱与缺陷>) [signal:几乎所有c语言程序的实现过程中都要用到signal ...

  3. signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析

    转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html void (*signal(int signo, void (*fun(int))))(i ...

  4. Signal ()函数详细介绍 Linux函数

    http://blog.csdn.net/ta893115871/article/details/7475095 Signal ()函数详细介绍 Linux函数 signal()函数理解 在<s ...

  5. Signal ()函数详细介绍 Linux函数(转)

    Signal ()函数详细介绍 Linux函数 收藏人:紫火神兵     2012-09-27 | 阅:5659  转:22    |   来源   |  分享               signa ...

  6. 【VS开发】程序如何捕捉signal函数参数中指定的信号

    当说到signal的功能时,我们都知道它会捕捉我们所指定的信号,然后调用我们所指定的信号处理函数.但它是如何捕捉我们指定的信号的呢?下面我就以msdn上关于signal的example为例,说明sig ...

  7. 信号之signal函数

    UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...

  8. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

  9. 深入理解,函数声明、函数表达式、匿名函数、立即执行函数、window.onload的区别.

    一.函数声明.函数表达式.匿名函数1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 2.函数表达式 var fnNam ...

随机推荐

  1. python hive

    sudo apt-get install sasl2-bin sudo apt-get install libsasl2-dev pip install pyhs2 pip install pyhiv ...

  2. 用mongodump以及mongorestore来完成mongo的迁移任务

    首先粘贴官网说明: 详细请见:https://docs.mongodb.com/manual/ 在实际操作中,一般只需用到 mongodump -h ip:port -d dbName -o path ...

  3. java数据结构之自定义队列

    一.队列的特点 1.队列是线性结构 2.先进先出,先进入队列的排在队列前端,会比后进队列的先出队列.FIFO 二.通过数组来实现队列 //自己实现数组队列,队列的特定就是先进先出 public cla ...

  4. SLC cache功能

    由于TLC需要多次编程,且未全部编程时wordLine处于不稳定状态,所以一般都会划出一部分区域作为SLC cache使用 SLC cache主要功能是,SSD接收到写命令后,先将数据写入SLC ca ...

  5. 自动化运维:(1)认识 Shell

    目录 (一)运维是什么? (二)什么是 Shell? (三)Shell的分类 (四)Shell脚本 (五)Shell的变量 (六)表达式 (七)Linux常见符号 (八)常见命令 (一)自动化运维是什 ...

  6. STS中依赖项的设置

    经过试验,把依赖项总结一下,可能会不断修改. 1. 父依赖项(固定) <parent> <groupId>org.springframework.boot</groupI ...

  7. ParallelForTransform作业

    ParallelForTransform作业是另一种ParallelFor作业 ; 专为在变形上操作而设计. 注意:ParallelForTransform作业是Unity中用于实现IJobParal ...

  8. 【CodeForces - 707B】Bakery(思维水题)

    Bakery Descriptions 玛莎想在从1到n的n个城市中开一家自己的面包店,在其中一个城市烘焙松饼. 为了在她的面包房烘焙松饼,玛莎需要从一些储存的地方建立面粉供应.只有k个仓库,位于不同 ...

  9. 静态web页面与动态web页面的区别

    一.静态web页面 在静态web程序中,客户端使用web浏览器经过网络连接到服务器上,使用HTTP协议发起一个请求(Request),告诉服务区我现在需要得到哪个页面,所有的请求交给web服务器,之后 ...

  10. centos7 httpd配置

    centos7 httpd配置 标签(空格分隔): 未分类 隐藏server信息 修改httpd.conf 设置,添加如下两行 ServerSignature Off ServerTokens Pro ...