预计阅读本页时间:-
正像关于声明的讨论中指出的那样,声明指向函数的指针是可以的。您可能想知道这样讨厌的家伙有些什么用处。典型的用法是,一个函数指针可以作为另一个函数的参数,告诉第二个函数使用哪一个函数。例如,对一个数组进行排序涉及到比较两个元素以决定哪个元素放在前面。如果元素是数字,可以使用>运算符。更普遍的是,元素可能是一个字符串或一个结构,需要一个函数调用来执行比较。C库里的qsort()函数是对任何类型的数组都适用的,只要告诉它用哪个函数来比较元素。为此,它接受一个指向函数的指针来作为一个参数。然后,无论数组元素的类型是整数、字符串或是结构,qsort()都使用这个函数对元素进行排序。
我们更进一步介绍函数指针。首先,函数指针是什么意思?假定一个指针指向一个int变量,它保存着这个int变量在内存中存储的地址。同样,函数也有地址,这是因为函数的机器语言实现是由载入到内存的代码组成。指向函数的指针中保存着函数代码起始处的地址。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
其次,当声明一个数据指针时,必须声明它指向的数据的类型。当声明一个函数指针时,必须声明它指向的函数类型。要指定函数类型,就要指出函数的返回类型以及函数的参量类型。例如,考虑以下原型:
函数ToUpper()的类型是“具有char *类型的参量,返回类型是void的函数”。要声明指向这种类型的函数的指针pf,可以这样做:
从这个声明中可以看出,第一对圆括号将运算符*和pf结合在一起,这意味着pf是一个指向函数的指针。这就使得(*pf)是一个函数,并使(char*)作为该函数的参量列表,void作为其返回类型。可能创建这个声明最简单的方法是注意到它用表达式(*pf)来代替函数名ToUpper。因此,如果想要声明一个指向某一特定类型函数的指针,可以声明一个这种特定类型的函数,然后用一个(* pf)形式的表达式来替代函数名,以创建一个函数指针声明。就像先前提到过的那样,由于有运算符优先级的规则,所以第一个圆括号是必需的。省略掉圆括号会导致完全不同的情况: