1. 基本概念:
程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。
2. 定义形式
类型名 (* 指针变量名)(参数类型1, 参数类型2,…);
例如:
int (*pf)(int ,char);
表示pf是一个函数指针,它所指向的函数,返回值类型应是int,该函数应有两个参数,第一个是int 类型,第二个是char类型。
3. 使用方法
可以用一个原型匹配的函数的名字给一个函数指针赋值。
要通过函数指针调用它所指向的函数,写法为:
函数指针名(实参表);
#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; }
4. 函数指针和qsort库函数
C语言快速排序库函数:
void qsort(void *base, int nelem, unsigned int width, int ( * pfCompare)( const void *, const void *));
可以对任意类型的数组进行排序。
实例:
下面的程序,功能是调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序。比如 8,23,15三个数,按个位数从小到大排序,就应该是 23,15,8 。
#include <stdio.h> #include <stdlib.h> int MyCompare( const void * elem1, const void * elem2 ) { unsigned int * p1, * p2; p1 = (unsigned int *) elem1; p2 = (unsigned int *) elem2; return (* p1 % 10) - (* p2 % 10 ); } #define NUM 5 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; }