函数指针数组
已知函数指针格式如下:
(pf是函数指针)
则可推出函数指针数组:
格式如上:其中Add,Sub,Mul,Div均为函数,arr就是函数指针的数组
若函数指针数组的格式如下
则下图为指向函数指针数组的指针

具体使用实例:
#include<stdio.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("*******************\n");
printf("***请选择计算方式***\n");
printf("***1.加法 2.减法 ***\n");
printf("***3.乘法 4.除法 ***\n");
printf("******************\n");
}
int (*pf[5])(int, int) = { 0,Add,Sub,Mul,Div };
int main()
{
menu();
int input, x, y;
scanf_s("%d", &input);
if (input == 0)
{
printf("退出");
}
else if (1 <= input && input <= 4)
{
printf("请输入两位有效数字");
scanf_s("%d %d", &x, &y);
int ret = pf[input](x, y);
printf("%d", ret);
}
else
{
printf("选择错误");
}
return 0;
回调函数
冒泡排序
基础版:
#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
int i;
for(i=0;i<sz-1;i++)
{
int j;
for(j=0;j<sz-1-i;j++)
{
if (arr[j] > arr[j + 1])
{
int stm = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = stm;
}
}
}
}
int main()
{
int arr[] = { 24,62,49,91,78,66,73 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int n = 0;;
for (n = 0; n < sz ; n++)
{
printf("%d ", arr[n]);
}
return 0;
}
如果数组里的值本来就是从小到大排序,这样的代码就显得效率过低;
所以要使用qsort函数(使用快速排序的思想):
使用示例:
进阶版:
头文件:#include<stdlib.h>

起始位置例如上述代码中的:arr
元素个数即为:sz
元素的大小(并非所有元素大小的和):sizeof(arr[0])
对于第四个则需要传送一个函数指针,需自定义一个函数int cmp_int(const void*e1,const void*e2)
而对于int cmp_int函数也有规定:
比较两个整型元素
e1指向一个元素,e2指向另一个元素
若e1指向的值<e2指向的值,则return 小于0的值
若e1指向的值=e2指向的值,则return 0
若e1指向的值>e2指向的值,则return 大于0的值
注:因为e1接收的是地址,所以需对其进行解引用操作
关于void*的介绍:
int a =10;
char*b=&a;//这种写法是错误的,&a是int*类型的,两者类型不同会报错;
void*d=&a;//而这种情况不会报错;
因为void*是无具体类型的指针,可接受任意类型的地址
所以不能解引用操作,也不能加减整数的操作
则*e1需强制转换类型,即:*(int*)e1
使用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[] = { 24,62,49,91,78,66,73 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
int n = 0;;
for (n = 0; n < sz ; n++)
{
printf("%d ", arr[n]);
}
return 0;
}
用qsort来排序结构数据:
struct Stu(名字)
{
char name[20];
int age;
};
int cmp_stu_by_name(const void*e1,const void*e2)
{
return strcmp(((struct Stu*)e1)->,((struct Stu*)e2)->);
}
int cmp_stu_by_age(const void*e1,const void*e2)
{
return ((struct Stu*)e1)->age-((struct Stu*)e2)->age;
int main()
{
struct Stu s[]={{"zhangsan",16},{“lisi",41},{"wangwu",61}};
int sz=sizeof(s)/sizeof(s[0]);
qsort(s,sz,sizeof(s[0]),cmp_stu_by_name);
}


1万+

被折叠的 条评论
为什么被折叠?



