blog_post/_posts/C函数指针.md
2024-04-03 08:20:53 +08:00

57 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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