寸阳分阴须爱惜,休负春色与时光。这篇文章主要讲述函数指针的实例讲解(下)相关的知识,希望能为你提供帮助。
引言:
在上篇说道当函数指针作为参数,需要通过typedef将函数指针重新声明便于使用。这篇主要讲解一下typedef的这种用法。
介绍
[百度百科]: typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
注意:typedef是为复杂的声明重新取一个一个简单的别名,即这个别名就是一个变量类型,可以重新定义变量。这一点与#define是不一样的。举个栗子:
typedef char* pStr1; #define pStr2 char* pStr1 s1,s2; pStr2 s3,s4;
其中s1、s2、s3都是char*类型,而s4是char类型。因为此时pStr1就是一个定义char*类型的数据类型,而pStr2只是char的替换,所以展开就成char *s3,s4。
C变量声明
以上基本了解了typedef的功能,在正式讲解typedef函数指针用法之前还需要重新认识一下C变量的声明。变量的声明由两部分组成:类型和类似于表达式的声明符。声明符从表面上看与表达式类似,对其求值应该返回一个声明中给定类型的结果。
最简单的声明符就是单个变量,如:
float f, g;
这个声明的含义是当对其求值时,f,g表达式会返回float类型的结果。
【函数指针的实例讲解(下)】同样的函数声明:
float ff();
这个声明的含义是表达式ff()求值结果是一个浮点数,也就是ff是一个返回值为浮点型的函数地址。
同理指针的声明:
float *pf;
这个含义是*pf求值结果是一个浮点数,pf则就是一个指向浮点数的指针。
由此引出函数指针的声明:
float (*pf)()
含义:首先(*pf)()返回值为float的函数,*pf是该函数地址,pf就是指向该函数的指针。
一旦明白变量的声明,那么该变量类型的类型转换符就很容易得到:只需要将声明中的变量名和末尾的分号去掉,再将剩余部分用()封装起来即可得到。例如:
float (*pf)();
表示pf是一个指向返回值为浮点型函数的指针,因此,
(float (*)())
表示一个"指向返回值为浮点型函数的指针"的类型转换符。
typedef函数指针用法
了解了类型转换符,我们就很容易声明一个执行函数类型的函数指针了。例如要声明一个指向参数为一个float,返回值为int的函数指针:
int (*func)(int); //注意变量名处在表达式的位置
利用typedef能够更加快速的声明一个函数指针:
typedef int (*PTASK)(int); PTASK task1;
含义:
首先PTASK类型转换符是一个指向参数为一个int,返回值为int的函数指针,typedef声明后的PTASK,即为可声明“一个指向参数为一个int,返回值为int的函数指针”的数据类型。
然后PTASK声明task1,则task1类型转换符与PTASK保持一致,即int ()(int),则其本身相当于int (task1)(int)。
推荐阅读
- 内核中的宏
- 并发与竞态(原子操作)
- IIC设备驱动实例调试
- Spark面试题——Spark资源调优
- #yyds干货盘点#一文读懂Hive底层数据存储格式
- C优先级
- #私藏项目实操分享# Go 语言入门很简单 -- 4. 常量
- Linux高精度定时器hrtimer使用实例
- Go iota 原理和源码剖析