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. Map构造器模式 map builder pattern

    maven引入依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava ...

  2. Java泛型(11):潜在类型机制

    泛型的目标之一就是能够编写尽可能广泛应用的代码. 为了实现这一点,我们需要各种途径来放松对我们的代码将要作用的类型所做的限制,同时不丢失静态类型检查的好处.即写出更加泛化的代码. Java泛型看起来是 ...

  3. jquery中对地址中的中文进行encodeURI编码

    传递参数:<script type="text/javascript">     var id= 'abc';  //字符串英文     var num = 998;  ...

  4. svn 创建外部链接

    背景: 之前的服务器项目<杀戮链条>,服务器工程中的common目录需要在多个子工程中共享,为了统一,所以只保留一个common目录,在子工程中采用外部链接的方法共享到工程中 1.  打开 ...

  5. docker部署jar、war包方法

    一.将war包放入容器 1.# docker imagesREPOSITORY                         TAG                 IMAGE ID         ...

  6. Metasploit入门教程

    0.Metasploit简介 Metasploit是一款开源的渗透测试框架平台,到目前为止,msf已经内置了数千个已披露的漏洞相关的模块和渗透测试工具,模块使用ruby语言编写,这使得使用者能够根据需 ...

  7. 【VS开发】组播(多播)的C程序实战

    每个人都有不同的认知规律和习惯, 有的人喜欢搞一套严密的大理论, 论述起来滔滔不绝, 不管自己懂不懂, 反正读者/听者是没搞懂. 有的人喜欢从实践出发, 没看到代码, 不运行一下, 不看到结果, 就不 ...

  8. 前端H5中JS用FileReader对象读取blob对象二进制数据,文件传输

    HTML5中的Blob对象只是二进制数据的容器,本身并不能操作二进制,故本篇将对其操作对象FileReader进行介绍. FileReader FileReader主要用于将文件内容读入内存,通过一系 ...

  9. JAVA实验报告四及第六周总结

    JAVA第六周作业 实验报告四 第一题 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆的半径. 2.圆类Circle的方法成员: Circle():构造 ...

  10. POJ1041 John's trip 【字典序输出欧拉回路】

    题目链接:http://poj.org/problem?id=1041 题目大意:给出一个连通图,判断是否存在欧拉回路,若存在输出一条字典序最小的路径. 我的想法: 1.一开始我是用结构体记录边的起点 ...