今天我们继续深入学习指针
1.回顾回调函数
我们回顾一下之前学过的回调函数
回调函数就是一个通过函数指针调用的函数
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外 的一方调用的,用于对该事件或条件进行响应
2.写一个bubble_sort函数
2.1认识一下qsort函数
同样,我们在cplusplus网站里学习一下
qsort - C++ Reference (cplusplus.com)
2.2写bubble_sort函数
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> void qsort //qsort底层使用的是快速排序 ( void* base,//指向待排序数据的起始地址 size_t num,//待排序数据的元素个数 size_t size,//待排序数据的一个元素的大小,单位是字节 int(*cmp)(const void* e1, const void* e2)//函数指针,指向一个比较函数,这个函数是用来比较2个元素的 ); int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } struct Stu { char name[20]; int age; }; int cmp_by_age(const void* e1, const void* e2) { return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age; } int cmp_by_name(const void* e1, const void* e2) { return strcmp(((struct Stu*)e1)->name , ((struct Stu*)e2)->name); } void swap(char* buf1, char* buf2, size_t size) { int i = 0; for (i = 0; i < size; i++) { char tmp = *buf1; *buf1 = *buf2; *buf2 = tmp; buf1++; buf2++; } } //使用冒泡排序的算法,模拟实现一个排序函数,可以排序任意类型的数据 //bubble_sort() void bubble_sort(void* arr,size_t sz,size_t size, 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 - 1 - i; j++) { if (cmp((char*)arr+j*size,(char*)arr+(j+1)*size)>0) { swap((char*)arr + j * size, (char*)arr + (j + 1) * size,size); } } } } //int(*cmp)(const void* e1, const void* e2) //e1是一个指针,存放了要比较的一个元素的地址 //e2是一个指针,存放了要比较的一个元素的地址 //e1指向的元素大于e2指向的元素,返回一个>0的数字 //e1指向的元素等于e2指向的元素,返回0 //e1指向的元素小于e2指向的元素,返回一个<0的数字 void print_arr(int arr[], int sz) { for (int i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } void test1() { 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,sizeof(arr[0]),cmp_int); print_arr(arr, sz); } void test2() { struct Stu arr[] = { { "zhangsan",20 } ,{ "lisi", 18 }, { "wangwu", 12 } }; int sz = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, sz, sizeof(arr[0]),cmp_by_age); bubble_sort(arr, sz, sizeof(arr[0]), cmp_by_name); } int main() { //test1();//测试排序整型数据 test2();//测试排序结构体数据 return 0; }
这里我们写的bubble_sort函数是升序的排序,具体的实现细节,我们后面的文章会分析