为了账号安全,请及时绑定邮箱和手机立即绑定

还有cmp函数中*(int*)a是什么意思?求大神解答

还有cmp函数中*(int*)a是什么意思?求大神解答

#include<stdio.h>#include<stdlib.h>int cmp(const void *a,const void *b){return *(int *)a - *(int *)b;}int main(void){int i,n,a[100];scanf("%d",&n);for (i=0;i<n;i++) scanf("%d",&a[i]);qsort(a,n,sizeof(a[0]),cmp);for (i=0;i<n;i++) printf("%d ",a[i]);return 0;}如以上程序,我们定义了的cmp带有2个参数,但是下面调用的时候却不需要带参数,这是为什么?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

因为cmp在传入qsort的时候是作为函数指针传入的,qsort在调用cmp(就是“回调函数”)的时候会传入合适的参数。

*(int*)a是因为:a是个void *类型,要先用(int*)将它转成int*类型,然后再用*取值,变成int类型,才能比较大小。

查看完整回答
反对 回复 2022-11-22
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

你这个 cmp和qsort中的cmp是一样的写法  应该说 qsort在排序的时候 会自动为cmp赋值参数 因为qsort中的cmd的参数原型就是这样的 这是他内部的比较机制 也就是这么规定的

对于下面的


int cmp(const void *a,const void *b){     return *(int *)a - *(int *)b; }

中的*(int*)a      可以看到 由于cmp函数要返回的int  切参数a,b都是指针形式的 但是不知道类型

所以比较的时候进行强制转换为int型的指针 然后通过括号外的*取得各自的int值大小进行各自变量的差值运算 得出各自变量的大小 后返回供 qsort内部调用   这些其实都是在qsort内部完成的  你的提问很好  很好的剖析了他的原理 共勉

 


查看完整回答
反对 回复 2022-11-22
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

头文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数: 1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
#########################################
qsort(a,n,sizeof(a[0]),cmp); // cmp是一个回调函数,我们必需按照qsort的函数声明中约定好的形式定义并且实现该函数,也就是说qsort需要的是一个函数指针,而函数名恰恰就是
########################################
*(int *)a // 因为a的类型是 void * ,先进行强制类型转换为 int *, 然后取值做差

查看完整回答
反对 回复 2022-11-22
  • 3 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号