目录
六.函数指针数组
七.指向函数指针数组的指针
八.回调函数
冒泡排序 与 qsort 函数
冒泡排序
qsort函数
六.函数指针数组
函数指针数组---数组存放的是函数
---指针存放的是函数的地址
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int main()
{
int (*pf1)(int, int) = &Add;
int (*pf2)(int, int) = ⋐
int (*pfArr[4])(int, int) = { &Add,&Sub };
//*pfArr存放函数指针的数组
//*pfArr[4]有4个元素,每个元素都是一个函数指针
return 0;
}
看下面的代码
case里面的语句,有好多重复
就可以利用函数指针数组去让下面的代码变得更简洁
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;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入2个操作数:");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("ret = %d\n", ret);
break;
case 2:
printf("请输入2个操作数:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("请输入2个操作数:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("请输入2个操作数:");
scanf("%d %d", &x, &y);
ret = Div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出程序!\n");
break;
default:
printf("选择错误!\n");
break;
}
} while (input);
return 0;
}
代码改进之后
会使多余的代码删除
在 ret = pfarr[input](x, y); 中如果输入的input 是 1 ----->则进入Add的函数中,将x,y的值传到Add函数中,返回x+y,输入其他数字同理,要注意的是input的值必须(>=1且<=4)
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;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
//函数指针数组
int (*pfarr[])(int, int) = { NULL,Add,Sub,Mul,Div };
if (0 == input)
{
printf("退出程序!\n");
}
else if (input >= 1 && input <= 4)
{
printf("请输入2个操作数:");
scanf("%d%d", &x, &y);
ret = pfarr[input](x, y);
printf("ret = %d\n", ret);
}
else
{
printf("选择错误,请重新选择!\n");
}
} while (input);
return 0;
}
上述代码展示,如下图
七.指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针
int main()
{
int a = 10, b = 20 , c = 30;
int* arr[] = { &a,&b,&c };
//整型指针数组
int* (*p)[3] = &arr;
//p是指针,是指向整形数组的指针
//函数指针数组,存放的是函数的地址
int(*pfArr[5](int, int) = { NULL,Add,Sub,Mul,Div };
//pfArr是函数指针数组
int (*(*p)[5])(int, int) = &Arr;
// *p 是指针,指向数组,有5个元素
// p 就是一个能够指向函数指针数组的指针
}
向函数指针数组 pfArr 的指针 p 就是一个能够指向函数指针数组的指针
( 博主在这里插一嘴,可以继续套娃哦)
八.回调函数
回调函数就是一个通过函数指针调用的函数
如果你把指针(地址)作为参数传给另外一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数
回调函数不是由该函数的实践方直接调用,而是在特定的事件或条件发生发生时由另外的一方调用的,用于该事件或条件进行响应
代码演示,用回调函数实现计算器(上面的代码):
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;
}
void calc(int (*pf)(int, int))
{
int x = 0;
int y = 0;
int ret = 0;
printf("请输入2个操作数:");
scanf("%d%d", &x, &y);
ret = pf(x, y);
printf("ret = %d\n", ret);
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
calc(Add);
break;
case 2:
calc(Sub);
break;
case 3:
calc(Mul);
break;
case 4:
calc(Div);
break;
case 0:
printf("退出程序!\n");
break;
default:
printf("选择错误!\n");
break;
}
} while (input);
return 0;
}
冒泡排序 与 qsort 函数
冒泡排序
代码展示:
void print_arr(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void bubble_sort(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
print_arr(arr, sz);//排序前
bubble_sort(arr, sz);
print_arr(arr, sz);//排序后
return 0;
}
注意 : 这个函数只能排序整形类型
qsort函数
void qsort(void* base, //待排序数组的第一个元素的地址
size_t num, //待排序数组的元素个数
size_t size,//待排序数组中一个元素的大小
int (* cmp)(const void* e1, const void* e2)//函数指针-cmp指向了一个函数,这个函数是用来比较两个元素的
e1和e2中存放的是需要比较的两个元素的地址
);
//1. 排序整型数组, 两个整型可以直接使用>比较
//2. 排序结构体数组,两个结构体的数据可能不能直接使用>比较
也就是不同类型的数据,比较出大小,方法是有差异的
qsort() 是 C语言的一个标准库函数,定义在<stdlib.h>
头文件中。
qsort() 函数用于对数组进行快速排序,它是一个通用的排序函数,支持对不同类型的元素进行排序。
qsort() 函数的原型如下:
void qsort (void *base , size_t nitems , size_t size , int (*compar ) ( const void *, const void* ) );
欲知后事如何,请听下章分解
新人博主,如果有地方解释的不对或者不清晰,麻烦大佬们海涵,如果可以麻烦从评论区指出,我一定会加以修改,万分感谢
最后麻烦大佬们动一下发财的小手一键三连,千万分感谢