6.函数指针数组
数组是存放相同类型元素的储存空间,函数指针数组,元素的类型便是函数指针
int(*arr[5])(int,int) 数组arr[5],元素类型是int(*)(int,int)
函数指针数组实现——>转移表
#include<stdio.h> void menu() { printf("*********************\n"); printf("*** 1.Add 2.Sub ****\n"); printf("*** 3.Mul 4.Div ****\n"); printf("***** 0.exit *******\n"); printf("*********************\n"); } 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; } int main() { int input = 0; int x = 0; int y = 0; int ret = 0; //函数指针数组 int(*pfarr[5])(int, int) = { 0,Add,Sub,Mul,Div }; do { menu(); printf("请选择>"); scanf("%d", &input); if (input == 0) { printf("退出计算器\n"); } else if (input >= 1 && input <= 4) { printf("请输入两个操作数>"); scanf("%d%d", &x, &y); int ret = pfarr[input](x, y); printf("%d\n", ret); } else { printf("选择错误,请重新选择\n"); } } while (input); return 0; }
7.回调函数
回调函数就是一个通过函数指针调用的函数
介绍 qsort 函数的使用
qsort函数可以排序任意类型的数据
void qsort(void*base,//待排序的数据的起始位置 size_t num,//待排序的数据的元素个数 size_t width,//待排序的数据的元素大小(单位字节) int(*cmp)(const void*e1,const void*e2)//函数指针-比较函数 )
void*是无具体类型的指针,可以接受任意类型的地址 void*是无具体类型的指针,不能进行解引用操作,也加减整数
qsort函数实现冒泡排序
#include<stdio.h> #include<stdlib.h> int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } int main() { int arr[] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_int); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
模拟qsort函数实现冒泡排序
#include<stdio.h> int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } void Swap(char* p1, char* p2, int width) { int i = 0; for (i = 0; i < width; i++) { char tmp = *p1; *p1 = *p2; *p2 = tmp; p1++; p2++; } } void qsort_int(void* base, int sz, int width, int(*pf)(const void* e1, const void* e2)) { int i = 0;//确定排序的趟数 for (i = 0; i < sz-1; i++) { int j = 0;//每趟排序中需要比对的次数 int flag = 1;//假设数组已是升序 for (j = 0; j < sz - 1 - i; j++) { if (cmp_int((char*)base + j * width, (char*)base + (j + 1) * width) > 0) { Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);//交换顺序 flag = 0; } } if (flag == 1) { break; } } } int main() { int arr[] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); qsort_int(arr, sz, sizeof(arr[0]), cmp_int); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }