目录
回调函数:
1.是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这个函数叫做回调函数。
2.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由
另外一方调用的,用于对该事件或条件进行响应。
//代码1:
//冒泡排序 -- 只能运用于整形
//void bubble_sort(int* arr,int sz)
//{
//
// int i = 0;
// int flag = 1;//如果第一趟一个都没有交换,说明这个数组就是按照给定顺序来的
// for (i = 0;i < sz - 1;i++)//趟数,10个元素应该进行9趟,最后一个元素,不需要排序
// {
// //每趟交换 第一趟进行9次交换
// int j = 0;
// for (j = 0; j< sz -1 - i ;j++)
// {
// if (arr[j] > arr[j+1])
// {
// int temp = arr[j];
// arr[j] = arr[j + 1];
// arr[j + 1] = temp;
// 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]);
// bubble_sort(arr,sz);
// int i = 0;
// for (i = 0;i < sz;i++ )
// {
// printf("%d ",arr[i]);
// }
// return 0;
//}
一、使用回调函数,模拟实现qsort:
#include<stdlib.h>
//qsort能应用于任何类型的比较
/*void qsort(void* base, size_t num, size_t size,int (*compar)(const void*, const void*));*///起始地址,个数,每个元素大小,比较元素
int cmp_int(const void* e1,const void* e2)
{
return *((int*)e1) - *((int*)e2);
}
struct Stu
{
char Name[20];
int age;
};
int cmp_by_name(const void* e1,const void* e2)
{
return strcmp(((struct Stu*)e1)->Name, ((struct Stu*)e2)->Name);
}
int cmp_by_age(const void* e1, const void* e2)
{
return (((struct Stu*)e1)->age - ((struct Stu*)e2)->age);
}
void test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, 4, cmp_int);
print(arr, sz);
}
void test2()
{
struct Stu s[3] = { {"张三",30},{"李四",40},{"王五",50} };
int sz = sizeof(s) / sizeof(s[0]);
int i = 0;
///按照名字来比较
qsort(s,sz,sizeof(s[0]),cmp_by_name);
for (i = 0; i < 3; i++)
{
printf("%s\n", s[i].Name);
}
//按照年龄比较
qsort(s, sz, sizeof(s[0]), cmp_by_age);
for (i = 0; i < 3; i++)
{
printf("%d\n", s[i].age);
}
}
int main()
{
test1();
test2();
return 0;
}
二、使用回调函,模拟实现qsort(采用冒泡的方式)
int cmp_int(const void* e1,const void* e2)
{
return *((int*)e1) - *((int*)e2);
}
struct Stu
{
char Name[20];
int age;
};
int cmp_by_name(const void* e1,const void* e2)
{
return strcmp(((struct Stu*)e1)->Name, ((struct Stu*)e2)->Name);
}
int cmp_by_age(const void* e1, const void* e2)
{
return (((struct Stu*)e1)->age - ((struct Stu*)e2)->age);
}
void Swap(char* a,char* b,size_t width)
{
size_t i = 0;
for (i = 0;i < width;i++)
{
char temp = *a;//每次访问一个字节
*a = *b;
*b = temp;
a++;
b++;
}
}
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1,const void* e2)) //定义函数指针,e1.e2可以不写
{
size_t i = 0;
for (i = 0;i < sz - 1;i++)//趟数,10个元素应该进行9趟,最后一个元素,不需要排序
{
//每趟交换 第一趟进行9次交换
size_t j = 0;
for (j = 0; j< sz -1 - i ;j++)
{
if (cmp((char*)base+ j*width,(char*)base+(j+1)*width)>0)//因为不知道传过来的是多大,所以用最小的char,每次跳过1个字节
{
//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
}
}
}
}
void print(int* arr, int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
//测试自定义的Bubblesort()排序结构体
void test2()
{
struct Stu s[3] = { {"张三",30},{"李四",40},{"王五",50} };
int sz = sizeof(s) / sizeof(s[0]);
int i = 0;
///按照名字来比较
bubble_sort(s, sz, sizeof(s[0]), cmp_by_name);
for (i = 0; i < 3; i++)
{
printf("%s\n", s[i].Name);
}
//按照年龄比较
bubble_sort(s, sz, sizeof(s[0]), cmp_by_age);
for (i = 0; i < 3; i++)
{
printf("%d\n", s[i].age);
}
}
//测试自定义的Bubblesort();
void test3()
{
int arr[] = {9,8,7,6,5,4,3,2,1,0};
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
print(arr,sz);
}
int main()
{
test2();//自定义测试结构体的比较
/*test3();*///自定义bubblesort测试
return 0;
}
打印:
三、 指针和数组笔试题解析
以上为指针3的知识点整理,如有误,请在评论区多多评论😄