上一篇文章简单介绍了函数指针和函数指针数组,本篇文章是介绍他们的用途。
函数指针数组的用途-----转移表:通过转移表来实现一个简单的计算器
代码如下:
#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
int Add(int x, int y)
{
return x + y;//加
}
int Sub(int x, int y)
{
return x - y;//减
}
int Mul(int x, int y)
{
return x * y;//乘
}
int Div(int x, int y)
{
return x / y;//除
}
void menu()
{
printf("******1.Add 2.Sub 3.Mul***********************\n");
printf("***********4.Div 0.Exit ***********************\n");
}//菜单
void test()
{
int input=1;
int x;
int y;
int ret = 0;
int(*p[5])(int, int) = { NULL,Add,Sub,Mul,Div };//函数指针数组
while (input)
{
menu();
printf("请选择:");
scanf("%d", &input);
if (input > 0 && input < 5)
{
printf("请输入操作数:");
scanf("%d%d", &x, &y);
ret = (*p[input])(x, y);//利用函数数组指针进行调用
printf("%d\n", ret);
}
else
printf("输入错误!\n");
}
}
int main()
{
test();
}
回调函数:回调函数是一个通过函数指针调用的函数,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方进行调用,用于对该事件或条件进行响应。
应用:模拟实现qsort(采用冒泡的方式)
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stu
{
int age;
char name[20];
};//定义结构体变量
int comp_int(const void *e1,const void *e2)
{
return (*(int *)e1) - (*(int *)e2);
}//整型的比较
int comp_student_byname(const void *e1, const void *e2)
{
return strcmp((*(struct Stu *)e1).name, (*(struct Stu *)e2).name);
}//按名字进行比较
int comp_student_byage(const void *e1, const void *e2)
{
return (*(struct Stu *)e1).age - (*(struct Stu *)e2).age;
}//按年龄进行比较
void swap_(char *e1, char *e2, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *(e1+i);
*(e1 + i) = *(e2 + i);
*(e2 + i) = tmp;
}
}//进行交换
void bubble_sort(void *arr,int width, int sz,int(*compar)(const void *e1,const void *e2))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (compar((char *)arr+j*width,(char *)arr+(j+1)*width)>0)
{
swap_((char *)arr + j*width, (char *)arr + (j + 1)*width,width);
}
}
}
}//利用回调函数进行排序
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
struct Stu student[3] = { { 18,"lisi"},{20,"zhangsan" },{10,"wamgwu"} };
int sz = sizeof(arr) / sizeof(arr[0]);
int sz1 = sizeof(student) / sizeof(student[0]);
bubble_sort(arr, sizeof(arr[0]),sz,comp_int);
bubble_sort(student, sizeof(student[0]), sz1, comp_student_byname);
//bubble_sort(student, sizeof(student[0]), sz1, comp_student_byage);
system("pause");
return 0;
}