C/C++函数指针声明
前天看APUE,看到signal的声明竟然是
void (*signal(int,void(*)(int)))(int);
初看下面,还真是看不出这是啥意思。道行太浅,仅仅能看到这样的函数指针
void *(*func)(int,void(*)(int));
书中说先typedef下面就能看清楚这个指针
typedef void Signfunc(int);
Signfunc *signal(int,Sigfunc *);
这样写的确变清晰了。但是搞不懂为啥应该是这么分析,为啥它不写成
(void (int))(*signal)(int,void(*)(int));
这么写不是更能看懂,然后我放到gcc里面编译,它说
error: expected identifier or ‘(’ before ‘void’
(void (int))(*signal)(int,void(*)(int));
改了一下。又说:
error: expected identifier or ‘(’ before ‘int’
void (int)(*signal)(int x,void(*func)(int))
error: ‘signal’ declared as function returning a function
void (*signal)(int,void(*)(int))(int);
error: ‘signal’ declared as function returning a function
void ((*signal)(int,void(*)(int)))(int);
看来它仅仅认这样的。真不知老美怎么想的,搞得这么难认。
看来仅仅能用这样的规则套了:
假设函数返回的不是函数指针。那么这个函数指针能够定义为例如以下形式:
test的返回值 ( *test)(test的型參);
假设返回的是函数指针。我们要写成:
返回函数的返回值 (*test(test的參数))(返回函数的型參);
然后能够组合成各种恐怖的函数声明
void (*((*signal(int,void(*)(int)))(int,void(*)(int)))(int,void(*)(int));
就是一个函数指针A。它返回的是一个函数指针B。这个B函数是一个返回函数C值针的函数。把复杂的參数先去掉,变成这样
void (*((*signal(int))(int))(int);
#include <stdio.h> void (*((*signal(int))(int)))(int);
void (*fun(int))(int);
void test(int); int main(int c, char ** v)
{
signal(323);
return 0;
} void (*((*signal(int x))(int)))(int)
{
printf("num:%d",x);
return fun;
} void (*fun(int y))(int)
{
return test;
} void test(int x)
{
printf("fuck C function pointer!!!,%d",x);
}
我们还能够继续
就是一个函数指针A,它返回的是一个函数指针B,这个B函数是一个返回函数C值针的函数。而函数C就是一个返回函数D指针的函数。。
。。。。
个人博客地址:http://www.flakor.cn
C/C++函数指针声明的更多相关文章
- C语言复杂的函数指针声明
复习C语言ING,发现复杂的函数指针声明看不懂,百度半天终于略知一二. 讲的比较详细的一篇blog: http://blog.csdn.net/megaboy/article/details/4827 ...
- 详解C/C++函数指针声明 ( *( void(*)())0)();
( *( void(*)())0)(); float *pf; 这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针. float *g() , (*h)(); 表示*g()与( ...
- 详解C/C++函数指针声明
要理解一个C程序,仅仅理解组成该程序的符号是不够的.程序员还必须理解这些符号是如何组合成声明.表达式.语句和程序的. 我们先来看看下面的一个语句: 1 ( *( void(*)())0)(); 这是当 ...
- 关于C/C++函数指针声明的理解
[前言] 由于最近对函数指针的理解比较模糊,所有又重新学习了一把关于函数指针的知识,参考了很多书籍和网上的文章.现在本人进行一下分享和总结.本文的其实只是整理和总结别人现有的文章,作为备用参考文档. ...
- C/C++中的成员函数指针声明及使用
代码: #include <iostream> using namespace std; class Test{ public: void func(){ cout<<&quo ...
- QT中使用函数指针
想仿命令行,所以定义了一个类,让一个String 对应一个 function,将两者输入list容器. 类中定义了 QString commandStr; void (MainWindow::*com ...
- 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表) 例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...
- 函数指针_typedef
一 函数指针 1 函数类型 函数的类型由它的返回值类型,和形参类型共通过决定,与函数名无关. eg:bool lengthcompare(const string&, const string ...
- 【转载】C/C++ 函数指针 总结
转载自:http://blog.csdn.net/shihui512/article/details/9787125 什么是函数指针函数指针的声明函数指针的赋值函数指针的使用将函数作为其他函数的参数在 ...
随机推荐
- 25.怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块
转自:https://blog.csdn.net/wangyj1992/article/details/78387728 因为项目的需要,所以研究了一下自动生成测试代码.将经验记录下来,总会有用的.我 ...
- ajax --- Ajax跨域请求保证同一个session的问题
我们知道,根据浏览器的保护规则,跨域的时候我们创建的sessionId是不会被浏览器保存下来的,这样,当我们在进行跨域访问的时候,我们的sessionId就不会被保存下来,也就是说,每一次的请求,服务 ...
- POJ2411 状态压缩dp
POJ2411 http://poj.org/problem?id=2411
- 洛谷——P1027 Car的旅行路线
https://www.luogu.org/problem/show?pid=1027#sub 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于 ...
- win7安装python开发环境,执行python
在win7上安装python的开发环境是很easy的事情 Step1:下载python安装文件 url:https://www.python.org/download 去这里找到你想要下载的文件 St ...
- tsp问题——遗传算法解决
TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...
- java之JMX
java之JMX 有关JMX的定义和架构就不具体解释了.见百度百科: http://baike.baidu.com/link? url=6QzGGEqphTmpft3ll5mXmDNVRdvLRZhk ...
- ORA-4031错误 解决方法
遇到ORA-4031错误时.你的心里会不会发怵?ORA-4031非常easy导致数据库出现异常崩溃,当Oracle的核心进程无法获得共享池内存时.它们会把数据库异常宕掉.当然,ORA-4031就像黄灯 ...
- [DLX反复覆盖] hdu 2828 Lamp
题意: 有N个灯M个开关 每一个灯的ON和OFF状态都能控制一个灯是否亮 给出N行,代表对于每一个灯 哪些开关的哪个状态能够使得第i个灯亮 思路: 这里须要注意一个问题 假设开关1的ON 状态和开关2 ...
- vim状态保存跟恢复
当我们结束了一天的工作的时候,可能手头的工作仅仅进行了一半,比如我们正在用vim修改一个android 问题,我们定位了问题关键,牵扯到了好几个类,如果这时候我们直接把vim关闭了,那我们下次还要重新 ...