qsort函数中的comp函数的一点问题

明日香asuka 2014-07-17 09:30:53
int cmp1(node i,node j)
{
return (-i.pos-3)*i.w-(-j.pos-3)*j.w;
}


int cmp1(const void* a,const void* b)
{
node i = *(node*)a;
node j = *(node*)b;
return (-i.pos-3)*i.w - (-j.pos-3)*j.w;
}


这两者的区别在哪?
...全文
285 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-07-17
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
mymtom 2014-07-17
  • 打赏
  • 举报
回复
第一段代码的函数参数类型不符合要求, 第二段代码的效率有问题,用指针多好

int cmp1(const void* a,const void* b)
{
  node *i = (node*)a;
  node *j = (node*)b;
  return (-i->pos-3)*i->w - (-j->pos-3)*j->w;
}
robertbo 2014-07-17
  • 打赏
  • 举报
回复
qsort的第四个参数要求输入一个指向函数的指针,stdlib.h里的定义是_In_ int (__cdecl * _PtFuncCompare)(const void *, const void *),因为指向int cmp1(node i,node j)的函数指针,与要求的参数不匹配,所以不能作为qsort的参数,而int cmp1(const void* a,const void* b)可以作为qsort的参数
Cnwanglin 2014-07-17
  • 打赏
  • 举报
回复
const void *a 这是定义了一个指针a,a可以指向任意类型的值,但它指向的值必须是常量。 在这种情况下,我们不能修改被指向的对象,但可以使指针指向其他对象。 例如: const void *a;*a=0x123;//是编译通不过的,因为*a中放的是个const值。const值是不能被改变的。 const int m=1; const int n=2; a=&m; a=&n;//编译可以通过。 void* const a 这是定义了一个const指针a,a可以指向任意类型的值,但a是指向某个对象的常量指针。 我们不能修改指针中存储的地址,但可以修改指针指向的对象。 例如: void* const a;这个定义:*a=0x123;是没问题的, 但是a=(void*)&b;是不行的,因为a是const变量。 如: int m=1; nt n=2; a=&m; a=&n;//编译不成功。
lm_whales 2014-07-17
  • 打赏
  • 举报
回复
qsort 是C库函数,实现对数组的快速排序, 要求传递,对指针所指对象比较的,比较函数(一个函数指针),作为参数。 这个函数指针的对应的函数, 两个指针参数,对应数组的两个元素的地址。 这个函数不适合链表排序。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧