焦作做微信网站多少钱,广州景点排行榜前十名,深圳专业做网站较好的公司,设计公司logo最重要的是什么目录 1. 回调函数 2. qsort相关知识#xff08;qsort可用于各种类型变量的排序#xff09; 一 回调函数 1定义/作用:把函数的指针#xff08;地址#xff09;作为参数传递给另⼀个函数#xff0c;当这个指针被⽤来调⽤其所指向的函数 时#xff0c;被调⽤的函数就…目录 1. 回调函数 2. qsort相关知识qsort可用于各种类型变量的排序 一 回调函数 1定义/作用:把函数的指针地址作为参数传递给另⼀个函数当这个指针被⽤来调⽤其所指向的函数 时被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的作用)⽤于对该事件或条件进⾏响应。 2好处下面我们来看两个效果相同的代码比较它们的简约程度
代码1(未使用回调函数 代码2(使用回调函数 总结这里我们使用回调函数使得重复得部分得到了优化代码变得更加简约。 二 qsort相关知识
1形式 void qsort ( void* base//base-待排序数组中的首元素 size_t num//待排序数组中的元素个数因为元素个数不可能是负数所以用size_t定义 size_t size//待排序数组中的一个元素的大小因为一个元素的大小不可能是负数所以用 size_t定义 int* *cmp)(const void*,const void*)//函数指针--指针指向的函数可用于比较base指向的数组中任何两个元素的大小。 因为用于比较的数组类型不同所以用void定义又因为我们只对数据进行排序而不对数据进行改变所以用const修饰防止数据被改写 ) 2 qsort 使⽤举例
2.1使⽤qsort函数排序整型数据
#include stdio.h
//qosrt函数的使⽤者得实现⼀个⽐较函数int int_cmp(const void * p1, const void * p2)
{return (*( int *)p1 - *(int *) p2);
}int main()
{int arr[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);for (i 0; i sizeof(arr) / sizeof(arr[0]); i)
{printf( %d , arr[i]);
}printf(\n);
return 0;
}
2.2使⽤qsort函数排序结构数据要指明排序类型例如描述一个人是使用结构体可能含有姓名性别等这时候就要指明你要排序的数据如要对姓名就要指明姓名 按照名字来排序 注意在按照名字进行比较时和整型有所不同因为名字是字符串要用strcmp函数。 按照年龄来⽐较 2.3 qsort函数的模拟【实现使⽤回调函数模拟实现qsort采⽤冒泡的⽅式】。
主体框架 注意我们这里要模仿qsort函数对其冒泡排序设置参数
排序的实现 注意这里和冒泡排序有所不同的是在于冒泡排序只对整型排序直接比较即可而我们这里比较两个元素的大小是通过字符类型来比较因为每个整数数组中的元素都是占4个字节所以要用强制类型转换将其转换为char*型而这里的width表示的是整型数组中一个元素的长度所以这里的(char*)base j * width,和(char*)base(j 1) * width表示第j个元素和第j1个元素
函数的声明 实现交换
因为一个整型占4个字节无法进行交换这时候我们将其划分为一个一个字节将其强制类型转换为字符型char*然后我们只要将两个元素的4个字节一一交换即可。 这里的n表示的是width(4),因为一个整型占4个字节而我们前面将其强制类型转换为字符型char*,这时候我们只要将两个元素的4个字节一一交换即可。 整体代码
#include stdio.hint cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}void swap(char* buf1, char* buf2, size_t n)
{int i 0;for (i 0; i n; i){char tmp *buf1;*buf1 *buf2;*buf2 tmp;buf1;buf2;}
}void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
{int i 0;//趟数for (i 0; i sz - 1; i){//一趟内部的排序int j 0;for (j 0; j sz - i - 1; j){if (cmp((char*)base j * width, (char*)base (j 1) * width) 0){//判断是否满足条件满足则进行交换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]);}printf(\n);
}
void test()
{int arr[] { 9,8,7,6,5,4,3,2,1,10};int sz sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);//模仿qsort函数对其设置参数print(arr, sz);//打印
}
int main()
{test();return 0;} 本篇文章就到此结束希望有所能帮到 读者更好的了解指针。