2.1 KiB
2.1 KiB
title | date | tags | categories | abbrlink | ||
---|---|---|---|---|---|---|
C函数指针 | 2017-10.28 10:59:10 |
|
|
364cc1f5 |
当我们看到如下所示的代码怎么去理解它的意义呢。
(* ( void (*) () ) 0) ()
解析这个函数需要下面几个知识
- 函数申明包含返回值,函数名,参数列表。
- 如返回值是'int' 函数名为'fun',参数列表为'void'。
-
int fun(void);
- 函数指针和返回值为指针的函数
- 函数指针:函数指针pfun指向的是一个返回值为int类型,参数列表为空的函数。只要是符合这个'形状'的函数都可以吧地址赋给pfun。
-
int (*pfun) (void);
- 返回值为指针的函数:返回值为int*类型的指针,参数列表为空的函数fun1。它表示fun1是一个确定的函数。不像pfun是可以指向任何符合模板的函数。
-
int* fun1 (void);
- 类型转化符。就像我们平时说的怎么把一个int强制转化为char呢,就是
我们怎么构建一个类型转化符呢,就是把目标类型用括号括起来,那么一个函数模板的类型转化符是怎么样的呢,就是把函数名去掉,然后用括号把他括起来。比如上面的函数指针pfun这个模板。我们只需要将pfun去掉,然后把剩下部分括起来。int a = 48; char b = (char) a;
这就是一个返回值为int参数列表为空的函数指针的强制类型转化符。(int (*) (void) )
完成上述理解之后,我们着手理解一下
(* ( void (*) () ) 0) ()
首先通过下面这个式子可以看出这是一个函数的调用,那么左括号里面的就是函名。
( funname ) ()
也就是 C * (void (*) () ) 0 == funname
把0强制类型转化为void (*) () 型的函数指针。也就是指向函数地址为0的指针 C (void (*) () ) 0