不见春山
骑马倚斜桥,满楼红袖招。
Home
Categories
Archives
Tags
About
Home
理解 typedef 定义的函数指针
理解 typedef 定义的函数指针
取消
理解 typedef 定义的函数指针
由
ctaoist
发布于 2020-05-18
·
最后更新:2022-01-14
1
在 C 里面,可以用 typedef 来为一个已有的数据类型增加一个新的别名。比如: ```c typedef int Length; ``` 这种简单的形式,大家都能理解。可是遇到下面这种形式,不少人就傻眼了。比如: ``` typedef int (*PFI)(int, const char *); ``` 难道是把 `int` 数据类型定义成了 `(*PFI)(int, const char *)` 的数据类型,可是哪有这样的数据类型啊。即使被别人告知这是定义了一种函数指针类型,但却怎么也无法和 `typedef int Length` 这种形式关联起来,不是应该有一种已有的数据类型,一种新的数据类型吗?可是它们在哪呢? 我们把上面的表达式稍做改变,疑惑就解开了,如下: ```c typedef int (int, const char *) * PFI; ~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ 原来的数据类型 别名 ``` 或者: ```c typedef int (int, const char *) *PFI; ~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ 原来的数据类型 别名 ``` 所以,这个表达式是定义了类型为 PFI 的函数指针类型,指向的函数,返回值是 `int` 型,形参是 `int` 和 `const char *`。所以,它的使用就很好理解了,**指向一种函数类型(返回值和参数列表形式相匹配)的指针**,比如: ```c //测试代码,所以没有写得很严谨 int str_chr(int index, const char *s) { return s[index]; } PFI funp = str_chr; //对于函数指针,这里也直接写成 PFI funp = &str_chr; 这种写法很少用 int ret = funp(5, "baurine"); //对于函数指针,也可以直接写成 int ret = (*funp)(5, "test"); ``` 也可以不将 PFI 定义成函数指针类型,而是直接定义成函数类型,如下: ```c typedef int PFI(int, const char *); ``` 那么它就要这么使用: ```c PFI *funp = str_chr; ``` 这就是 C 语言的灵活之处。 来看一个更复杂的吧 (与 typedef 无关了): ```c void (*signal(int signo, void (*func)(int)))(int); ``` 是不是要疯了…至少第一次看到这种定义的时候,我是的。这是 Unix/Linux 里系统调用 signal 函数的原型。这样的定义怎么来理解呢,同样,我们来做一下调整,如下: ```c void (int) * signal(int signo, void (int) *func); ~~~~~~~~~~~~~ ~~~~~~ ~~~~~~~~~ ~~~~~~~~~~~~~~~~~ 返回值类型 函数名 形参一 形参二 ``` 所以,首先这个表达式是定义了一个函数,函数名是 signal,形参一是 int 型,返回值和形参二的类型是一样的,都是函数指针,指向的函数,返回值是 void,形参是 int 型。呃,是不是很绕。 signal 函数的作用就是为某个信号注册一个新的信号处理函数,同时返回原来的信号处理函数,以便在退出时进行恢复。 上面的定义形式实在是不是太复杂了,所以 man 手册上实际上是这么定义的: ```c typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); ``` PS: 在《c++ primer》有讲解相关函数指针的知识 ## 类成员的函数指针 [普通函数指针与类成员函数指针的区别](https://blog.csdn.net/google0802/article/details/52386560)
杂集
C++
C
该博客文章由作者通过
CC BY 4.0
进行授权。
分享
最近更新
群晖升级 ARPL 笔记
本地部署大语言模型
LVM 管理
HK1 RBOX X4 电视盒子折腾笔记
使用usbip网络转发usb设备到远程主机
热门标签
机器学习
Linux
Router
ROS
Tensorflow
VPN
虚拟组网
ARM
Latex
zerotier
文章目录
tensorflow-gpu 安装笔记
应对PPPOE拨号用户24/48小时断线一次