✨ 猪巴戒:个人主页✨
所属专栏:《C语言进阶》
🎈跟着猪巴戒,一起学习C语言🎈
目录
前情回顾
函数指针
我们有一个函数,为Add,我们将函数的地址用指针来存储,这个指针就叫做函数指针。
int Add(int x,int y)
{
return x+y;
}
int main()
{
int (*pf)(int,int) = Add;//pf就是函数指针。
return 0;
}
函数指针数组
把函数指针放在数组中,就是函数指针的数组。
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 (*arr[4])(int ,int) = {Add,Sub,Mul,Div};//这个就是函数指针数组。
return 0;
}
函数指针数组就可以调用函数:
int main()
{
int i = 0;
scanf("%d",&i);
int ret = arr[i](8,4);
printf("%d\n",ret);
}
1、回调函数
回调函数就是应该通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由这个函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
我们可以把Add函数称为回调函数。
int Add(int x,int y)
{
return x+y;
}
int main()
{
int (*pf)(int,int) = Add;
int ret = pf(8,4);
return 0;
}
2、冒泡排序
对一个数组进行升序排序。
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 };
//把数组排成升序
int sz = sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,sz);
int i = 0;
for(i=0;i<sz;i++)
{
printf("%d",arr[i]};
}
这个冒泡排序不够高效,如果我们进行一趟冒泡排序,但是一个数字都没有交换,就说明这个数组已经排序好了,就不用继续排序了,
我们可以通过,在进行这一趟冒泡排序前设定int flag = 1;
如果数字进行了交换,就把flag的值改为0;
没有数字进行交换,那么flag的值还是1;
我们通过判断flag的值看数组是否已经排好序。
void bubble_sort(int arr[],int sz)
{
int i=0;
//趟数
for(i=0;i<sz-1;i++)
{
int flag = 1;//假设数组是排好序的。
//一趟冒泡排序的过程
int j = 0;
for(j=0;j<sz-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp = arr[j];
arr