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. C++typedef的详细用法

    转自知乎的一段解释: 作者:知乎用户链接:https://www.zhihu.com/question/29798061/answer/144423125来源:知乎著作权归作者所有.商业转载请联系作者 ...

  2. Masonry创建Label,不设置高度Label不显示问题

    [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(weanSelf).off ...

  3. Python3 Selenium自动化web测试 ==> 第八节 WebDriver高级应用 -- 结束Windows中浏览器的进程

    学习目的: 掌握WebDriver的高级应用 正式步骤: # -*- coding:utf-8 -*- from selenium import webdriver from selenium.web ...

  4. 架构模式: 服务前端的后端(BFF模式)

    架构模式: 服务前端的后端(BFF模式) 上下文 让我们假设您正在构建一个使用Microservice体系结构模式的在线商店,并且您正在实现产品详细信息页面.您需要开发产品详细信息用户界面的多个版本: ...

  5. docker 启动镜像报 WARNING: IPv4 forwarding is disabled. Networking will not work.

    centos7 解决办法: # vi /etc/sysctl.conf 添加如下代码:     net.ipv4.ip_forward=1 重启network服务 # systemctl restar ...

  6. 爬虫实现51job谁看过我的简历多条记录功能

    默认情况下51job只能看到最近一条记录,查看更多记录需要付费. 本文利用爬虫定时抓取记录,并追加写入到文本的方式获取完整的记录信息. import requests from bs4 import ...

  7. layui 时间选择器 不要秒的选项

    通过修改 CSS 样式可以隐藏秒的选项 ++ .laydate-time-list{padding-bottom:0;overflow:hidden} .laydate-time-list>li ...

  8. 18.linux日志收集数据到hdfs上面

    先创建一个目录 在这个job目录下创建upload.sh文件 [hadoop@node1 ~]$ pwd /home/hadoop [hadoop@node1 ~]$ mkdir job [hadoo ...

  9. 【转帖】Linux和GNU系统

    Linux和GNU系统 Richard Stallman 著 http://www.gnu.org/gnu/linux-and-gnu.zh-cn.html 更多信息,请同时参看GNU/Linux常见 ...

  10. GridControl gridView显示筛选行,设置条件为包含

    public static void SetFilter(GridView gdv) {     gdv.OptionsView.ShowAutoFilterRow = true; //设置筛选行  ...