函数指针定义: 函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。 定义形式: 类型名 (* 指针变量名)(参数类型1, 参数类型2,…); 例如: int (*pf)(int ,char); 表示pf是一个函数指针,它所指向的函数,返回值类型应是int,该函数应有两个参数,第一个是int 类型,第二个是char类型 使用实例(求两个数最小数):
#include <stdio.h>
void PrintMin(int a,int b) {
if( a<b )
printf(“%d”,a);
else
printf(“%d”,b);
}
int main() {
void (* pf)(int ,int);
int x = 4, y = 5;
pf = PrintMin;
pf(x,y);
return 0;
}
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数组按照个位数从小到大进行排序。
#include <stdio.h>
#include <stdlib.h>
#define NUM 5
int MyCompare( const void * elem1, const void * elem2 )
{
unsigned int * p1, * p2;
p1 = (unsigned int *) elem1; // “* elem1” 非法
p2 = (unsigned int *) elem2; // “* elem2” 非法
return (* p1) - (* p2);
}
int main()
{
unsigned int an[NUM] = { 8,123,11,10,4 };
qsort( an,NUM,sizeof(unsigned int), MyCompare);
for( int i = 0;i < NUM; i ++ ) printf(“%d “,an[i]);
return 0;
}
输出结果:4 8 10 11 123