基本概念
引用北大版ppt
程序运行期间,每个函数都会占用一
段连续的内存空间。而函数名就是该函数所
占内存区域的起始地址(也称“入口地址”)。
我们可以将函数的入口地址赋给一个指针变
量,使该指针变量指向该函数。然后通过指
针变量就可以调用这个函数。这种指向函数
的指针变量称为“函数指针”。
定义形式
一般语法
数据类型(* 指针变量名)(形参表)
如:
int (*pf)(int ,char);
重复定义
由于对函数指针的定义在形式上比较复杂,如果在程序中出现多个这样的定义,多次重复会比较繁琐,可以使用typedef解决。
如:
typedef int (* DIFunction)(double);
DIFunction funcptr;
赋值与调用
函数指针在使用之前也要进行赋值,是指针指向一个已经存在的函数代码的起始地址,一般语法为:
函数指针名=函数名
此函数名必须是一个已经声明过、和指针函数具有相同返回值类型和相同形参表的函数。
赋值后可以通过函数指针名来直接引用这个函数指针指向的函数。
例:通过输入Max,输出4与5中较大的值,输入其他字符串输出较小的值。
函数指针与qsort库函数
C语言快速排序库函数:
void qsort(void *base, int nelem, unsigned int width,
int ( * pfCompare)( const void *, const void *));
base: 待排序数组的起始地址,
nelem: 待排序数组的元素个数,
width: 待排序数组的每个元素的大小(以字节为单位 )
pfCompare :比较函数的地址
pfCompare: 函数指针,它指向一个“比较函数”。
该比较函数应为以下形式:
int 函数名(const void * elem1, const void * elem2);
比较函数编写规则:
(1) 如果 * elem1应该排在 * elem2前面,则函数返回值是负整数
(2) 如果 * elem1和* elem2哪个排在前面都行,那么函数返回0
(3) 如果 * elem1应该排在 * elem2后面,则函数返回值是正整数
如图所示,实现8,123,11,10,4通过比较个位数大小实现的数组排序。(由小到大)