一道令人迷茫的题目??

raymond323 2005-09-03 06:17:42
c和c++代码精粹上有这么一道题:
#include <stdlib.h>
#include <stdio.h>

int comp(const void*,const void*);

int main()
{
int i;
char* a[]={"a","abc","bc","dfgdg"};
int n=sizeof a/sizeof a[0];
qsort(a,n,sizeof a[0],comp);
for(i=0;i<=n;++i)
{
printf("%s",a[i]);
printf(" ");
}
system("pause");
}

int comp(const void* p1,const void* p2)
{
const char** ps1=(const char**) p1;
const char** ps2=(const char**) p2;
return strcmp(*ps1,*ps2);
}
我把comp函数定义成:
int comp(const void* p1,const void* p2)
{
const char* ps1=(const char*) p1;
const char* ps2=(const char*) p2;
return strcmp(ps1,ps2);
}
运行结果也对 我搞不明白定义成const char** ps1=(const char**) p1;
有什么样的好处 和 意义
...全文
346 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2005-09-04
  • 打赏
  • 举报
回复
二级指针 是必要 的 !!

另外,什么是回调函数?具体的机制是什么样子??这个不明白
-------------------------
这个你在论坛里面搜索一下唉,很多这样的问题了 ~
sankt 2005-09-04
  • 打赏
  • 举报
回复
up
luwy 2005-09-04
  • 打赏
  • 举报
回复
实际简单的说 字符串的的比较需要的参数是指向字符串的指针 就本题而言 由于定义
char* a[]={"a","abc","bc","dfgdg"};是指针数组,所以参数应该是a[0],a[1]...
int comp(const void* p1,const void* p2)
{
const char** ps1=(const char**) p1;
const char** ps2=(const char**) p2;
return strcmp(*ps1,*ps2);
}
则*strcmp(*ps1,*ps2);来说*ps1,*ps2的值为a[0],a[1]...
int comp(const void* p1,const void* p2)
{
const char* ps1=(const char*) p1;
const char* ps2=(const char*) p2;
return strcmp(ps1,ps2);
}
ps1,ps2的值为&a[0],&a[1]....
明显不对啥
何哀何欢 2005-09-03
  • 打赏
  • 举报
回复
你比那个作者精炼,那个作者 脱了裤子放屁。
foochow 2005-09-03
  • 打赏
  • 举报
回复
当qsort回调你的comp函数时,它只是传回无类型(void*)的数组元素的地址值(注意是地址,不是值),你需要根据你的实际情况来判断是否要把它转化成别的类型.在你的程序中,你的数组元素类型是char*, 所以qsort以void*的方式传回的是char**,所以你要先把它转化成char**,然后得到元素的值 *(char**) ==> char*,再作比较,现在清楚了吧......
bingbox_1984 2005-09-03
  • 打赏
  • 举报
回复
指针数组是二级指针
另外,什么是回调函数?具体的机制是什么样子??这个不明白
qsort(a,n,sizeof a[0],comp);它这个怎么调用的??
megaboy 2005-09-03
  • 打赏
  • 举报
回复
二级指针那个是对的,楼主自己写那个是错的,楼主自己写的那个看上去似乎是对的,但只不过他定义的指针数组所指向的字符串刚好是从小到大的,如果他把a定义成这样:char* a[]={"a","abc","dfgdg","bc"};就能看见自己错在什么地方了。


comp是qsort的回调函数,它是用元素的地址来作为comp的实参的,就是说,如果比较a[1]和a[2],comp是这样调用的,comp(&a[1], &a[2]),由于a是一个指针数组,&a[1]对于a[1]所指向的字符串来说,实际上是一个二级地址,因此在comp内部需要转换为二级指针,再取值,才是各字符串的首地址。

而楼主的函数,却是把元素的地址作为字符串的地址,由于a数组存放的是指针,不是实际的字符串,结果当然是不正确的。
mituzhishi 2005-09-03
  • 打赏
  • 举报
回复
我也觉得没必要用二级指针。

不过两个肯定都对。

64,654

社区成员

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

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