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

Posted H₂O₂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数指针的实例讲解(下)相关的知识,希望对你有一定的参考价值。



引言:

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





以上是关于函数指针的实例讲解(下)的主要内容,如果未能解决你的问题,请参考以下文章

一次学透C指针C进阶

更新:C++ 指针片段

片段 getArguments() 空指针异常

创建片段而不从 java 代码实例化它

指针的这些知识你知道吗?C语言超硬核指针进阶版3w+字详解+指针笔试题画图+文字详细讲解

mfc中slider控件实例整个操作过程和讲解