C函数指针

当我们看到如下所示的代码怎么去理解它的意义呢。

1
(* ( void (*) () ) 0) ()

解析这个函数需要下面几个知识

  1. 函数申明包含返回值,函数名,参数列表。
    • 如返回值是’int’ 函数名为’fun’,参数列表为’void’。
    • int fun(void);
      
      1
      2
      3
      4
      2. 函数指针和返回值为指针的函数
      - 函数指针:函数指针pfun指向的是一个返回值为int类型,参数列表为空的函数。只要是符合这个'形状'的函数都可以吧地址赋给pfun。
      - ```c
      int (*pfun) (void);
    • 返回值为指针的函数:返回值为int*类型的指针,参数列表为空的函数fun1。它表示fun1是一个确定的函数。不像pfun是可以指向任何符合模板的函数。
    • int* fun1 (void); 
      
      1
      2
      3
      4
      5
         所以在书写的时候必须注意是否需要加括号。
      3. 类型转化符。就像我们平时说的怎么把一个int强制转化为char呢,就是
      ```C
      int a = 48;
      char b = (char) a;
      我们怎么构建一个类型转化符呢,就是把目标类型用括号括起来,那么一个函数模板的类型转化符是怎么样的呢,就是把函数名去掉,然后用括号把他括起来。比如上面的函数指针pfun这个模板。我们只需要将pfun去掉,然后把剩下部分括起来。
      1
      (int (*) (void) )
      这就是一个返回值为int参数列表为空的函数指针的强制类型转化符。

完成上述理解之后,我们着手理解一下

1
(* ( void (*) () ) 0) ()

首先通过下面这个式子可以看出这是一个函数的调用,那么左括号里面的就是函名。

1
(       funname     ) ()

也就是 ```C
* (void (*) () ) 0 == funname

1
2
3

0强制类型转化为void (*) () 型的函数指针。也就是指向函数地址为0的指针 ```C
(void (*) () ) 0


C函数指针
http://example.com/2017/10/28/C函数指针/
作者
Ekko bao
发布于
2017年10月28日
许可协议