C语言之指针详解(6)

您所在的位置:网站首页 在C语言中整数可以以十进制八进制或16进制的形式输出 C语言之指针详解(6)

C语言之指针详解(6)

2023-06-21 09:36| 来源: 网络整理| 查看: 265

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当 这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调 用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应 那我们来看下面代码 #include 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; } } } } struct Stu { char name[20]; int age; }; int main() { int arr[10] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} }; bubble_sort(arr, sz);//这个冒泡排序类型只能排序整型,不能排序其他类型 int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; } 那我们如何优化这种代码呢???这里我们需要了解一下qsort库函数 qsort----quick sort快速排序 qsort库函数有4个参数,这里重点说一下最后一个参数,这里的*先和compar结合,说明他是一个桌指针,然后再和(const void*,const void*e2)结合说明

这是一个函数,这就是一个函数指,且函数的返回类型为int型给大家解释一下这四个参数分别代表的意思

base:目标数组的起始位置

num:数组的大小(单位为元素),也就是数组有几个元素

size:元素的大小(单位为字节),也就是一个元素的大小(单位为字节)

compar:比较

现在我们来看代码

#include #include void qsort(void* base, size_t num, size_t size, int (*compar)(const void* e1, const void* e2)); int cmp_int(const void* e1, const void* e2) { } int main() { int arr[10] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); //struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };//结构体数组 //bubble_sort(arr, sz);//这个冒泡排序类型只能排序整型,不能排序其他类型 qsort(arr, sz, sizeof(arr[0]), cmp_int); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }

我们把cmp_int函数放到qsort这个函数中,,函数名和参数值以及返回类型和qsort的第四个参数的函数参数以及函数的返回值是一致的,所以我们就可以通过(*compar)找到cmp_int这个函数名(也可以叫做是函数的地址)大家这里可能有个疑问,我们见过int*,char*,double*,float*等等,但是没有见过void*,我这里给大家解释一下,我们来看代码

#include int main() { int a = 10; int* pa = &a; char* pc = &a; void* p = &a; p = &pc; //void*类型的指针,可以接收任意类型的地址 }

void*类型的指针,可以接收任意类型的地址

当我们要排序其他的类型(int*,char*等等),这是void就可以接收这些类型,就不用我们多次去改变变量类型

我们来看一下void*类型需要注意的事项,我们看代码

#include int main() { int a = 10; int* pa = &a; char* pc = &a; void* p = &a; *p = 0; p++; //void*类型的指针,可以接收任意类型的地址 //void*类型的指针,不能进行解引用操作 //void*类型的指针,不能进行+-整数的操作 }

我们接着来看刚才我们写到的qsort函数,这里的void*指针变量的值不能被改变(不能解引用),我们需要强制类型转换,强制类型转换为int*类型的指针就可以进行*解引用了

打印出来是从小到大的升序数组

#include #include //void qsort(void* base, size_t num, size_t size, int (*compar)(const void* e1, const void* e2)); int cmp_int(const void* e1, const void* e2) { return *(int*)e1 - *(int*)e2; } int main() { int arr[10] = { 9,8,7,6,5,4,3,2,1,0 }; int sz = sizeof(arr) / sizeof(arr[0]); //struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",10} };//结构体数组 //bubble_sort(arr, sz);//这个冒泡排序类型只能排序整型,不能排序其他类型 qsort(arr, sz, sizeof(arr[0]), cmp_int); int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }

结构体数组的快速排序和float类型的快速排序我将在下一个博客的开头给大家做详细的讲解!

本章终,这一章节难度大,大家多消化理解一下

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3