做网站需要了解的内容,网站二维码链接怎么做,做物流的在什么网站找客户呢,给网站做游戏视频怎么赚钱文章目录 ✈ 指向函数指针数组的指针#x1f4cc;指向函数指针数组的指针的定义#x1f4cc;指向函数指针数组的数组指针的使用 ✈回调函数#x1f4cc; 回调函数的定义#x1f4cc; 回调函数的使用 ✈qsort函数#x1f4cc; qsort函数的作用#x1f4cc;qsort函数的定义… 文章目录 ✈ 指向函数指针数组的指针指向函数指针数组的指针的定义指向函数指针数组的数组指针的使用 ✈回调函数 回调函数的定义 回调函数的使用 ✈qsort函数 qsort函数的作用qsort函数的定义qsort函数的头文件1.qsort函数排序整型数组比较函数compare主函数 2.qsort函数排列结构体数据【1】排列结构体中的整型类型比较函数主函数以及结构体 【2】排列结构体中的字符串类型比较函数compare主函数 【3】 排列结构体中的浮点型数据比较函数compare主函数 3.qsort函数排列字符数组类型数据比较函数compare主函数 ✈使用回调函数模拟实现qsort采用冒泡的方式冒泡排序传送门在此[冒泡排序](https://blog.csdn.net/yyqzjw/article/details/131909947?spm1001.2014.3001.5501)模拟实现qsort排整型数组利用冒泡排序方式 总结 ✈ 指向函数指针数组的指针 指向函数指针数组的指针是一个 指针 指针指向一个 数组 数组的元素都是 函数指针 ; 如何定义 指向函数指针数组的指针的定义
我们可以先定义五个函数
int add(int a, int b)
{return a b;}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a*b;
}
int div(int a, int b)
{return a / b;
}分别计算两个变量的加减乘除然后定义一个函数指针数组用来存放上面4个函数的地址 int(*p[5])(int x, int y) { 0, add, sub, mul, div }; 空出来一个是为了让加减乘除函数与下标对应上 int (*(*pp)[5])(int x,int y) p;这个是指向函数指针数组的数组指针,ta指向的函数指针数组的类型是去掉*pp int (*()[5])(int x,int y)这个类型说明数组指针指向的是数组长度是5每个元素都是地址每个元素的类型是 int ()(int x,int y)画图说明一下关系
指向函数指针数组的数组指针的使用 怎么通过这个数组指针pp去使用加减乘除这几个函数呢代码如下 int add(int a, int b)
{return a b;}
int sub(int a, int b)
{return a - b;
}
int mul(int a, int b)
{return a * b;
}
int div(int a, int b)
{return a / b;
}
int main()
{int(*p[5])(int x, int y) { 0, add, sub, mul, div };int (*(*pp)[5])(int x, int y) p;int ret (*(*pp 1))(3, 4);printf(%d, ret);
}在这块解释一下子 (*(*pp 1))(3, 4)pp存放的是p[]整个数组的地址*pp相当于拿到这个数组也相当于拿到数组的数组名相当于数组首元素地址*pp1为第二个元素地址 如果在对其解引用得到的是 *pp1这个就是数组第二个元素的内容也就是说add的地址因为add和add打印的结果一样使用该函数计算34 add(3,4)等价 ((*pp 1))(3, 4) ✈回调函数 回调函数的定义 回调函数pp()就是一个通过函数指针void(*p)()调用的函数。如果你把函数的指针地址作为参数传递给另一个函数print(pp);当这个指针被用来调用其所指向的函数时pp()我们就说这是回调函数。回调函数不是由该函数的实现方直接调用而是在if (1)特定的事件或条件发生时由另外的一方调用的用于对该事件或 条件进行响应。 回调函数的使用
void pp()
{printf(hahahahaha\n);
}
void print(void(*p)())
{if (1){p();}
}
int main()
{ print(pp);return 0;
}根据回调函数的定义可知pp()函数就是回调函数。 ✈qsort函数 qsort函数的作用 我们之前学过的冒泡排序可以将一个整型数组排好序如果让我们去排序浮点型字符型结构体型我们应该怎么办呢 qsort函数可以解决这个问题万物皆可排。那谁谁你怎么插队呢快去排队 qsort函数的定义 在msdn上找到定义我们可以将定义复制过来
void qsort( void *base,size_t num,size_t width,int (__cdecl *compare )(const void *elem1, const void *elem2 ) );什么英格力士 下面有请过英语四级的小张同学给翻译翻译哈哈哈哈哈 咳咳我来了 1.base指针指向的是要排序数组的首地址因为不清楚要排序的是什么类型的数据这里用void 可以接收任何类型的指针 2.num是该数组的元素个数 3.width是每个元素的字节大小 4.自定义比较函数compare 第四个位置是一个函数指针来接收一个比较函数的地址参数用两个指针接收要比较两个元素的地址因为不知道比较什么类型的数据就用void的指针接收,比较函数是根据你自己要排列的数据类型自己定义的。 第一个元素大于第二个元素返回大于0的小于第二个元素返回小于0等于返回0 qsort函数的头文件 1.qsort函数排序整型数组
比较函数compare
int int_cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}这里要排整型数据将void的指针强制类型转化为int,一次可以访问4个字节 解引用也可以得到一个整型数据 主函数 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;
}注意如果要排成降序只需要将比较函数中的 int int_cmp(const void* p1, const void* p2) { return ((int)p2 - (int)p1); } 2.qsort函数排列结构体数据
【1】排列结构体中的整型类型
比较函数
int int_cmp_age(const void* p1, const void* p2)//按年龄比较
{return ((struct Stu*)p1)-age - ((struct Stu*)p2)-age;
}主函数以及结构体
struct Stu {char name[20];int age;float score;
};
int main()
{int i 0;struct Stu arr[3] {{zhangjiawang,18,100},{zhumiao,50,76},{liuliu,19,76}};int sz sizeof(arr) / sizeof(arr[0]);qsort(arr,sz, sizeof(arr[0]), int_cmp_age);for (int i 0; i 3; i){printf(%d , arr[i].age);}return 0;
}运行结果 【2】排列结构体中的字符串类型
比较函数compare
int int_cmp_age(const void* p1, const void* p2)
{return (strcmp(((struct Stu*)p1)-name), ((struct Stu*)p2)-name);
}字符串比较用strcmp函数记得添加头文件string.h 这个是strcmp函数的返回值和比较函数刚好对应上 主函数
int main()
{int i 0;struct Stu arr[3] {{zhangjiawang,18,100},{zhumiao,50,76},{liuliu,19,76}};int sz sizeof(arr) / sizeof(arr[0]);qsort(arr,sz, sizeof(arr[0]), int_cmp_age);for (int i 0; i 3; i){printf(%s , arr[i].name);}return 0;
} 运行结果 【3】 排列结构体中的浮点型数据
比较函数compare
int int_cmp_float(const void* p1, const void* p2)
{return (*(float*)p1 -*(float*)p2);
}主函数
int main()
{int i 0;struct Stu arr[3] {{zhangjiawang,18,100.0},{zhumiao,50,76.0},{liuliu,19,77.0}};int sz sizeof(arr) / sizeof(arr[0]);qsort(arr,sz, sizeof(arr[0]), int_cmp_float);for (int i 0; i 3; i){printf(%.1f , arr[i].score);}return 0;
}运行结果 3.qsort函数排列字符数组类型数据
比较函数compare
int int_cmp(const void* p1, const void* p2)
{return (*(char*)p1 - *(char*)p2);
}主函数
int main()
{char arr[] {b,c,a,f,z,q};int i 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(char), int_cmp);for (i 0; i sizeof(arr) / sizeof(arr[0]); i){printf(%c , arr[i]);}printf(\n);return 0;
}运行结果 ✈使用回调函数模拟实现qsort采用冒泡的方式
冒泡排序传送门在此冒泡排序
int main()
{int arr[10] {10,9,8,7,6,5,4,3,2,1};int sz sizeof(arr) / sizeof(arr[0]);//数组长度int i;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;}}}for (i 0; i sz; i)//打印数组{printf(%d , arr[i]);}
}模拟实现qsort排整型数组利用冒泡排序方式
主函数
int main()
{int arr[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int i 0;bubble_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;
}模拟qsort函数 将冒泡排序的实现copy过来然后对其修改 大概替换的思想是 void bubble_sort(void* base, int num, int width, int cmp) {int i; for (i 0; i num - 1; i) { int j 0; for (j 0; j num - 1 - i; j) { if (比较函数的返回值) {交换数组元素的函数} } } } 比较函数compare(这里因为要排的是整型数组用上面整型数组的比较函数就行)int cmp(const void* p1, const void* p2) { return ((int)p1 - (int)p2); } 现在的问题是怎么使用bubble_sort函数的参数找到要比较两个元素的地址 代码cmp((char*)basej*width),(char*)base(j1)*width)0 问题1为什么要将base地址存在char的指针中 方便访问任意类型数据因为width是一个元素的字节大小如果访问一个整型的地址width就是4char的指针4刚好跳过4个字节如果把base地址用int*接收如果width还是4的话4就跳过的不是一个元素而是4个元素相邻的元素根本就比不了大小。 如果j0的话上面传到比较函数中的就是第一个元素地址和第二个元素地址 替换后的bubble_sort void bubble_sort(void* base, int num, int width, int cmp)
{int i;for (i 0; i num - 1; i){int j 0;for (j 0; j num - 1 - i; j){if (cmp((char*)base j * width), (char*)base (j 1) * width) 0){交换数组元素的函数}}}}
}现在的问题是怎么交换两个地址上的元素。交换数组元素的函数void swap(char* p1, char* p2, int width)
{int i 0;for (i 0; i width; i){char tmp *p1;*p1 *p2;*p2 tmp;p1;p2;}
} 这里的交换函数是按字节交换的,比如说数组前两个元素13假如说内存为小端存储实现前两个元素交换 替换后的bubble_sort void bubble_sort(void* base, int num, int width, int cmp)
{int i;for (i 0; i num - 1; i){int j 0;for (j 0; j num - 1 - i; j){if (cmp((char*)base j * width), (char*)base (j 1) * width) 0){swap((char*)base j * width), (char*)base (j 1) * width));}}}}
}整体代码展示 #include stdio.h
int cmp(const void* p1, const void* p2)
{return (*(int*)p1 - *(int*)p2);
}
void swap(char* p1, char* p2, int width)
{int i 0;for (i 0; i width; i){char tmp *p1;*p1 *p2;*p2 tmp;p1;p2;}
}
void bubble_sort(void* base, int num, int width, int cmp(const void* p1, const void* p2))
{int i;for (i 0; i num - 1; i){int j 0;for (j 0; j num - 1 - i; j){if (cmp((char*)base j * width, (char*)base (j 1) * width) 0){swap((char*)base j * width,(char*)base (j 1) * width,width);}}}}
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), cmp);for (i 0; i sizeof(arr) / sizeof(arr[0]); i){printf(%d , arr[i]);}printf(\n);return 0;
}
总结
希望这篇文章可以给你带来帮助如果有不对的地方或者有哪里不理解的地方请私信我谢谢大家支持下篇见以上 文章转载自: http://www.morning.bssjp.cn.gov.cn.bssjp.cn http://www.morning.kuaijili.cn.gov.cn.kuaijili.cn http://www.morning.lfbsd.cn.gov.cn.lfbsd.cn http://www.morning.qhjkz.cn.gov.cn.qhjkz.cn http://www.morning.llmhq.cn.gov.cn.llmhq.cn http://www.morning.rwpfb.cn.gov.cn.rwpfb.cn http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.lsjtq.cn.gov.cn.lsjtq.cn http://www.morning.rsnn.cn.gov.cn.rsnn.cn http://www.morning.leboju.com.gov.cn.leboju.com http://www.morning.gbfuy28.cn.gov.cn.gbfuy28.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.sjwzz.cn.gov.cn.sjwzz.cn http://www.morning.lsjtq.cn.gov.cn.lsjtq.cn http://www.morning.tfpmf.cn.gov.cn.tfpmf.cn http://www.morning.plnry.cn.gov.cn.plnry.cn http://www.morning.mlbn.cn.gov.cn.mlbn.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.ykshx.cn.gov.cn.ykshx.cn http://www.morning.jmwrj.cn.gov.cn.jmwrj.cn http://www.morning.dgxrz.cn.gov.cn.dgxrz.cn http://www.morning.xhjjs.cn.gov.cn.xhjjs.cn http://www.morning.tqbyw.cn.gov.cn.tqbyw.cn http://www.morning.rtsdz.cn.gov.cn.rtsdz.cn http://www.morning.rxhn.cn.gov.cn.rxhn.cn http://www.morning.qygfb.cn.gov.cn.qygfb.cn http://www.morning.mnwsy.cn.gov.cn.mnwsy.cn http://www.morning.msfqt.cn.gov.cn.msfqt.cn http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn http://www.morning.jnbsx.cn.gov.cn.jnbsx.cn http://www.morning.yhywx.cn.gov.cn.yhywx.cn http://www.morning.mprpx.cn.gov.cn.mprpx.cn http://www.morning.wmqrn.cn.gov.cn.wmqrn.cn http://www.morning.ttdxn.cn.gov.cn.ttdxn.cn http://www.morning.qwpyf.cn.gov.cn.qwpyf.cn http://www.morning.tdxlj.cn.gov.cn.tdxlj.cn http://www.morning.hydkd.cn.gov.cn.hydkd.cn http://www.morning.wbns.cn.gov.cn.wbns.cn http://www.morning.phcqk.cn.gov.cn.phcqk.cn http://www.morning.wdpt.cn.gov.cn.wdpt.cn http://www.morning.hfxks.cn.gov.cn.hfxks.cn http://www.morning.xpzkr.cn.gov.cn.xpzkr.cn http://www.morning.gsqw.cn.gov.cn.gsqw.cn http://www.morning.wfysn.cn.gov.cn.wfysn.cn http://www.morning.qbwyd.cn.gov.cn.qbwyd.cn http://www.morning.fcrw.cn.gov.cn.fcrw.cn http://www.morning.jpnw.cn.gov.cn.jpnw.cn http://www.morning.jzmqk.cn.gov.cn.jzmqk.cn http://www.morning.tnjff.cn.gov.cn.tnjff.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.kxwsn.cn.gov.cn.kxwsn.cn http://www.morning.clbgy.cn.gov.cn.clbgy.cn http://www.morning.yuanshenglan.com.gov.cn.yuanshenglan.com http://www.morning.qhtlq.cn.gov.cn.qhtlq.cn http://www.morning.zqbrw.cn.gov.cn.zqbrw.cn http://www.morning.rnygs.cn.gov.cn.rnygs.cn http://www.morning.bnwlh.cn.gov.cn.bnwlh.cn http://www.morning.pcqxr.cn.gov.cn.pcqxr.cn http://www.morning.mxlwl.cn.gov.cn.mxlwl.cn http://www.morning.pwlxy.cn.gov.cn.pwlxy.cn http://www.morning.zlnkq.cn.gov.cn.zlnkq.cn http://www.morning.wqbbc.cn.gov.cn.wqbbc.cn http://www.morning.sqqkr.cn.gov.cn.sqqkr.cn http://www.morning.gpsr.cn.gov.cn.gpsr.cn http://www.morning.mwbqk.cn.gov.cn.mwbqk.cn http://www.morning.rlns.cn.gov.cn.rlns.cn http://www.morning.btwrj.cn.gov.cn.btwrj.cn http://www.morning.cbpkr.cn.gov.cn.cbpkr.cn http://www.morning.rynrn.cn.gov.cn.rynrn.cn http://www.morning.lrprj.cn.gov.cn.lrprj.cn http://www.morning.chmcq.cn.gov.cn.chmcq.cn http://www.morning.ggnfy.cn.gov.cn.ggnfy.cn http://www.morning.kybyf.cn.gov.cn.kybyf.cn http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn http://www.morning.zrrgx.cn.gov.cn.zrrgx.cn http://www.morning.lnrhk.cn.gov.cn.lnrhk.cn http://www.morning.tmjhy.cn.gov.cn.tmjhy.cn http://www.morning.lmfxq.cn.gov.cn.lmfxq.cn http://www.morning.ujianji.com.gov.cn.ujianji.com