目录
五、函数指针
定义:
指向函数的指针
代码一:
cs
(* (void (*)( ))0( )
代码二:
cs
void (*siqnal)(int , void(*) (int))
六、函数指针数组
定义:
存放函数指针的数组
用途:
可以用来做建议计算器
cs
int (*pf[5])(int, int) = { NULL,Add,Sub,Mul,Dir };
计算+、-、*、/
七、指向函数指针数组的指针
cs
int (*(*pf)[5])(int,int)
八、回调函数
定义:
通过函数指针调用的函数
把函数指针指向的函数地址作为参数传递给另一个函数
简易计算器(回调函数实现):
cs
#include <stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
void calc(int(*pf)(int, int))
{
printf("请输入两个数:");
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int ret = pf(a, b);
printf("结果为%d\n", ret);
}
int main()
{
calc(Add);
calc(Sub);
return 0;
}
qsort函数快速排序
cs
#include <stdio.h>
#include <stdlib.h>
struct stu
{
char name[20];
int age;
};
int cmp_int_name(const void* e1, const void* e2)
{
return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
int main()
{
struct stu s1[3] = { {"wangling",20},{"caokai",19},{"zhanghua",30} };
int sz = sizeof(s1) / sizeof(s1[0]);
qsort(s1, sz, sizeof(s1[0]), cmp_int_name);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s\n", s1[i]);
}
return 0;
}
模拟实现qsort函数
cs
#include <stdio.h>
//用来交换
void swap(char* sp1, char* sp2, size_t width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *sp1;
*sp1 = *sp2;
*sp2 = tmp;
sp1++;
sp2++;
}
}
//com_int用来比较e1和e2的大小
int com_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
//模拟实现qsort
int my_qsort(void* base, size_t sz, size_t width, int(*cmp)(const void*, const void*))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
int main()
{
int arr[] = { 2,4,7,9,1,4,7,3,10,8,1,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, sz, sizeof(arr[0]), com_int);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}