基本概念

程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个函数。这种指向函数的指针变量称为“函数指针”。

定义形式

类型名 (* 指针变量名)(参数类型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 *));

可以对任意类型的数组进行排序。

对数组排序,需要知道:

  1. 数组起始地址
  2. 数组元素的个数
  3. 每个元素的大小(由此可以算出每个元素的地址)
  4. 元素谁在前谁在后的规则

参数说明

base: 待排序数组的起始地址,直接写待排序数组的名称 nelem: 待排序数组的元素个数 width: 待排序数组的每个元素的大小(以字节为单位),sizeof(T) pfCompare :比较函数的地址,直接写比较函数的名字

pfCompare 函数

排序就是一个不断比较并交换位置的过程。

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