函数指针和qsort库函数

函数指针定义:

函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

定义形式:

类型名 (* 指针变量名)(参数类型1, 参数类型2,…);

例如: int (*pf)(int ,char);

表示pf是一个函数指针,它所指向的函数,返回值类型应是int,该函数应有两个参数,第一个是int 类型,第二个是char类型

使用实例(求两个数最小数):

 

qsort库函数

C语言快速排序库函数:
void qsort(void *base, int nelem, unsigned int width,
int ( * pfCompare)( const void *, const void *));
可以对任意类型的数组进行排序

base: 待排序数组的起始地址

nelem: 待排序数组的元素个数

width: 待排序数组的每个元素的大小(以字节为单位)

pfCompare: 函数指针,它指向一个“比较函数”。

该比较函数应为以下形式:
int 函数名(const void * elem1, const void * elem2);
比较函数是程序员自己编写的

 

排序就是一个不断比较并交换位置的过程。
qsort函数在执行期间,会通过pfCompare指针调用 “比较函数”,调用时将要比较的两个元素的地址传给“比较函数”,然后根据“比较函数”返回值判断两个元素哪个更应该排在前面。

 

int 比较函数名(const void * elem1, const void * elem2);
比较函数编写规则:

1.如果 * elem1应该排在 * elem2前面,则函数返回值是负整数

2. 如果 * elem1和* elem2哪个排在前面都行,那么函数返回0

3. 如果 * elem1应该排在 * elem2后面,则函数返回值是正整数

 

实例:

下面的程序,功能是调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序。

输出结果:4 8 10 11 123