qsort函数中的const void*是代表什么意思

icelover 2004-11-18 09:06:12
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

int compare( const void *arg1, const void *arg2 );

void main( int argc, char **argv )
{
int i;
/* Eliminate argv[0] from sort: */
argv++;
argc--;

/* Sort remaining args using Quicksort algorithm: */
qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );

/* Output sorted list: */
for( i = 0; i < argc; ++i )
printf( "%s ", argv[i] );
printf( "\n" );
}

int compare( const void *arg1, const void *arg2 )
{
/* Compare all of both strings: */
return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );
}
这是MSDN上解释qsort的一段代码,请问compare函数的两个参数const void *arg1,arg2是什么意思,为什么要定义成const void*呢?这种类型是代表什么意思,它和一般的指针之间做转换时必须要按照compare函数里面的这种方法进行吗?
...全文
629 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
icelover 2004-11-19
  • 打赏
  • 举报
回复
"(char*)arg1只是将const void *强制转化为char*,而这时的arg1地址指向的内存存放的并不是字符"
为什么,在compare函数里面没有修改实参的值啊,只是得到实参的值并进行比较啊
skyofdreams 2004-11-19
  • 打赏
  • 举报
回复
是啊,为了在调用函数中修改实参值,就要多用一级指针,很迂回. 所以C++才引入了"引用". 让脑子稍微不晕一点. 不过其实习惯了也无所谓,只是麻烦一点.写C程序结构好的话,一般到不了三级.

我补充一点, void 是一个空类型,就是不告诉编译是什么类型. 对应的 void* p就是说它指向了一个东西,但告诉编译器东西是多大. 因此就无法直接存取,必须强制后才能间接取值运算(*). *(char*)p取出p指的一个字符大小的那样的左值.
icelover 2004-11-19
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p = "abc";

void *q= p;
printf("%s",(char*)p);
system("pause");
}
为什么这个可以得出正确的结果呢?
icelover 2004-11-19
  • 打赏
  • 举报
回复
有没有人知道啊,帮忙解释一下
mefit 2004-11-18
  • 打赏
  • 举报
回复
首先,要知道return _stricmp( * ( char** ) arg1, * ( char** ) arg2 )的参数是把argv传过去的,而argv是char**,因为先将char**转化为const void *,
* ( char** ) arg1是将const void *转化为char** 后在取它所指地址中的值(该值也为地址,一个指向字符的地址)
(char*)arg1只是将const void *强制转化为char*,而这时的arg1地址指向的内存存放的并不是字符
icelover 2004-11-18
  • 打赏
  • 举报
回复
为什么compare里面不能这样写
return _stricmp((char*)arg1,(char*)arg2);
dongyuanzhang 2004-11-18
  • 打赏
  • 举报
回复
顶!
whoho 2004-11-18
  • 打赏
  • 举报
回复
C中的qsort因为分离了比较,所以一般说来速度要慢一些
whoho 2004-11-18
  • 打赏
  • 举报
回复
可以把任何指针都赋予void*,加上一个const自然也好理解
在C中没有模板,如果把一个任意的C类型进行比较?只能通过void*
struct A{ int x; int y}a;
void *pt = &a;

为什么需要从qsort中抽出比较?因为不同类型的比较是不一样的,有的甚至没有内置方式
另外你需要按照什么样的顺序进行排序,也是你自己可以定制才行

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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