标签:
? ?
一、函数的指针: #include "stdafx.h" ? #include <stdio.h> #include "t.h" ? void Function(int i) { ????printf("Call Function: %d\n", i); } ? void f1() { ????typedef void (*PFUNC)(int); ????PFUNC pfunc; ????pfunc = Function; ????pfunc(1);???? ???? ????pfunc = &Function; ????pfunc(2); } ? ? void f2() { ????typedef void (FUNC)(int); ???? ????FUNC* pfunc; ????pfunc = Function; ????pfunc(3); ? ????pfunc = &Function; ????pfunc(4);???? ? } ? void t2() { ????f1(); ????f2(); } /* Call Function: 1 Call Function: 2 Call Function: 3 Call Function: 4 请按任意键继续. . . */ 二、函数指针拆解: #include<signal.h> void (*signal(int signo,void(*func)(int)))(int); ? 1、使用typedef拆解 typedef void(*sighandler_t)(int); sighandler_t signal(int signum,sighandler_t handler); ? 2、使用函数指针理解 int (*p)(); p指向的是一个不带任何参数,并且返回值为int的函数; int (*fun())(); 这个式子与上式区别在于用fun()代替p,即fun()返回值是一个函数指针,这个函数指针(可以看作p),指向一个不带任何参数,并且返回值为int的函数;因此,对于 void (*signal(int signo,void(*func)(int)))(int); 可以看成是signal()函数,此函数带两个参数:一个为整型,一个为函数指针。而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的函数。 ? 这个函数过于复杂,本身没有任何意义,通常都是使用typedef之后的简单信号处理函数。 ? 3、实例分析 1、实例源代码 ? 2、执行程序 ? 3、查看进程号 ? 4、给进程发送信号 ? 5、进程接收到信号 ? ? 三、(*(void(*) ())0)()------这是什么?
这是《C Traps and Pitfalls》这本经典的书中的一个例子。没有发狂吧?下面我们就来分析分析:
? ? 参考: 1. 关于"void (*signal(int signo,void(*func)(int)))(int)"的剖析http://www.51hei.com/bbs/dpj-29464-1.html ; 2. c语言函数指针的理解与使用; |
?
标签:
原文地址:http://www.cnblogs.com/mylinux/p/4677508.html