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

时间:2022-07-22
本文章向大家介绍函数指针的实例讲解(下),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

引言:

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