基本概念
- 程序运行期间,每个函数都会占用一段连续的内存空间
- 函数名就是该函数所占内存区域的起始地址(入口地址)
- 可以将函数的入口地址赋给指针变量,使该指针变量指向该函数,通过指针变量就可以调用这个函数
- 这种指向函数的指针变量被称为“函数指针”
定义形式
- 类型名(* 指针变量名)(参数类型1,参数类型2,......)
int (*pf)(int , char); //pf为一个函数指针,它所指向的函数的返回值是int,2个参数一个是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;
}
//pf指针指向PrintMin
qsort库函数
- 对数组排序,需要知道
- 数组起始地址
- 数组元素个数
- 每个元素的大小(从而得出每个元素的地址)
- 元素谁前谁后的规则
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);
//比较函数是程序员自己编写的
- 排序就是一个不断比较并交换位置的过程
- qsort函数在执行期间,会通过pfCompare指针调用“比较函数”,调用时将要比较的两个元素的地址传给“比较函数”,然后根据“比较函数”返回值判断哪个应该排在前面
- 比较函数编写规则
- 如果*elem1应该在前,函数返回负整数
- 如果*elem2应该在前,函数返回正整数
- 如果无所谓前后,函数返回0
- 实例
- 功能:调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序
#include <stdio.h>
#include <stdlib.h>
int MyCompare(const void * elem1,const void * elem2)
{
unsigned int * p1, * p2;
p1 = (unsigned int *) elem1; //"*elem1" 非法,编译器不知道void指针指向的元素有多少个字节
p2 = (unsigned int *) elem2; //"*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;
}
网友评论