c语言中 qsort中使用的cmp为什么不需要带参数进去计算? 20

#include<stdio.h>#include<stdlib.h>intcmp(constvoid*a,constvoid*b){return*(int*)a-*(i... #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个参数,但是下面调用的时候却不需要带参数,这是为什么?
还有cmp函数中*(int*)a是什么意思?求大神解答
展开
 我来答
冰火梦幻
2013-12-30 · TA获得超过2308个赞
知道小有建树答主
回答量:1095
采纳率:57%
帮助的人:421万
展开全部
因为cmp在传入qsort的时候是作为函数指针传入的,qsort在调用cmp(就是“回调函数”)的时候会传入合适的参数。

*(int*)a是因为:a是个void *类型,要先用(int*)将它转成int*类型,然后再用*取值,变成int类型,才能比较大小。
happy活着就好
2013-12-30 · TA获得超过454个赞
知道小有建树答主
回答量:611
采纳率:100%
帮助的人:338万
展开全部

你这个 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内部完成的  你的提问很好  很好的剖析了他的原理 共勉

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2013-12-30 · TA获得超过409个赞
知道答主
回答量:80
采纳率:0%
帮助的人:27.2万
展开全部
头文件: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 *, 然后取值做差
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
qiuzhizhe1991
2013-12-30
知道答主
回答量:20
采纳率:0%
帮助的人:7.6万
展开全部
cmp默认为升序排列,但是也可以自定义,就像你上面定义的函数一样,程序就会按照你给的条件进行排序。cmp的参数是从你给的排序参数中直接提取的,因此不需要调用参数,那样就是多此一举了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
与子如初见
2013-12-30 · TA获得超过1638个赞
知道小有建树答主
回答量:1117
采纳率:100%
帮助的人:792万
展开全部
可以吧,函数名本身就是个地址,那块传进去的参数是个整形地址就可以。
*(int *)a的意思是把传进的地址a强转成int *类型的地址,然后对这个地址取值得到一个整形数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式