函数指针的实例讲解(下)

寸阳分阴须爱惜,休负春色与时光。这篇文章主要讲述函数指针的实例讲解(下)相关的知识,希望能为你提供帮助。




引言:
在上篇说道当函数指针作为参数,需要通过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)。









    推荐阅读