#include<iostream.h>
#include<iomanip.h>
#include<string.h>
#include<stdlib.h>
int compare3(const void *a,const void *b);
char *list[10]={"enter","number","size","begin","of","cat","case","program","certain","a"};
void main()
{
int size=sizeof(list)/sizeof(list[0]);
cout<<"the original array is:"<<endl;
for(char **iPtr=&list[0];*iPtr!=\0;*iPtr++)
cout<<*iPtr<<endl;
cout<<"the array after sorting is:"<<endl;
qsort((void *)list,size,sizeof(list[0]),compare3);
for(int i=0;i<size;i++)
cout<<list[i]<<endl;
}
、、//看下面的?为什么呀
int compare3(const void *a,const void *b)
{
return strcmp(*(char **)a,*(char **)b);//此句为什么非要先转化为一个二级指针呀
}
如果改为int compare3(const void *a,const void *b)
{
return strcmp((char *)a,(char *)b);//此句为什么非要先转化为一个二级指针呀
}
也能通过编译,但是结果不对,却是为何呀???????
那为什么在c 中,对malloc()的转换可直接进行呢?
char *p=(char *)malloc(char );
我也说不大明白,可是你那个好像的确是错的,(char *)a中将a转化为char*,而实际上a,b为char* [],而*(char **)a中先将a
因为在qsort((void *)list,size,sizeof(list[0]),compare3);中
qsort会调用compare3并且把list的每个元素的地址传进去做参数,其实也就是&(list+i)
它的类型为char**,所以在compare3中要使用二级指针。
mark
开始,我也觉得搂主改写后没什么问题。调试后才搞懂。上面两位说的都对。
首先,list是一个指针数组,就是说sizeof(list[0])==4; compare3()中的a,b 是&list[i]的地址。
如b=&list[0],&list[0]==0x00428d50(我机子上的调试时值),0x00428d50中存的int值为0x00426060.0x00426060才是"enter"的地址。,(char *)b取得当然不是"enter"的地址了.
*(char **)a !=(char *)a 我以前对这个了解也不具体。现在明白了。:)
不知,搂主是否明白了.最好是调试一下,看看compare3()中传进的a,b 的值就明白了.
上面有个地方写错了.
compare3()中的a,b 是&list[i]的地址。
应该是compare3()中的a,b 是&list[i]的值。
由于list是指针数组,一几指针指向的是各个数组元素地址,而二几指针才指向数组元素中字符串的首地址。
1: *(char **)a !=(char *)a
你随便定义变量,如char *a=NULL;测试一下.(会当掉哦)
虽然表面看左右两个表达式的类型一样,但他们的值是肯定不同的!
2: char *p=(*(char **))malloc(char); 我在vc6.0调试不能通过.
改为char *p=*(char **)malloc(char); 可以,但p的取值是分配的内存中的第一个int值,
不是分配的内存地址.
3: int compare3(const void *a,const void *b)
{
return strcmp(*(char **)a,*(char **)b);//此句为什么非要先转化为一个二级指针呀
}
因为qsort((void *)list,size,sizeof(list[0]),compare3);中的list为一个二级指针.
传入的a,b 是&list[i];不是list[i]!!!
不懂~就去看看c指针吧.都是对指针的理解问题.