一个很基础的指针问题,为什么非要转化为一个二级指针再转化为一级指针呀,才能?、请高手指教 、
一个很基础的指针问题,为什么非要转化为一个二级指针再转化为一级指针呀,才能
例子:
#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);//此句为什么非要先转化为一个二级指针呀
}
问题点数:0、回复次数:8Top
1 楼bluei(蓝之我)回复于 2003-08-02 13:01:01 得分 0
问得太笼统了吧?
问题点数>0后,看看效果会怎么样。Top
2 楼prettynacl(lulu)回复于 2003-08-02 13:19:55 得分 0
函数参数a,b的类型是void*
要进行强制转换后才能确定a,b指向的内容是什么类型的值。
在这里将它们强制转换成char**类型,
所以,再进行(*(char**)a)的操作后,才可以将a指向的值作为一个指针。
Top
3 楼crcr(游侠)回复于 2003-08-02 23:59:16 得分 0
那为什么在c 中,对malloc()的转换可直接进行呢?
char *p=(char *)malloc(char );
Top
4 楼crcr(游侠)回复于 2003-08-03 00:19:23 得分 0
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);//此句为什么非要先转化为一个二级指针呀
}
也能通过编译,但是结果不对,却是为何呀???????Top
5 楼crcr(游侠)回复于 2003-08-03 14:33:42 得分 0
为什么呀?Top
6 楼prettynacl(lulu)回复于 2003-08-04 14:10:24 得分 0
举个例子:
int compare3(const void *a,const void *b)
{
return strcmp(*(char **)a,*(char **)b);
}
如a的值为0x10000000
而在0x10000000等位置处存贮如下内容:
address val
0x10000000 0x11
0x10000000 0x00
0x10000000 0x00
0x10000000 0x00
那么:(char **)a
就说明在a处保存的是一个指针,占用4字节
这样,再取其值:*(char**)a就可以取到4字节的值:0x11000000
如果*(char*)a则说明a处是一个字符,取值会只取一个字节:0x11
对于strcmp函数,是比较两个地址处的字符串的,
如我举的例子,是比较b与0x11000000处的字符串,
而你那样写:strcmp((char *)a,(char *)b)
是比较b与0x10000000处的内容,当然是不对了,
因为实际要比较的不是a处的内容,而是a处指针所指的内容
Top
7 楼crcr(游侠)回复于 2003-08-04 22:02:22 得分 0
我认为不是的呀,你看,一个char(*a)明明是把一个void *形的指针转化为一个CHAR 形的指针,呀,不是您 说的CHAR(*A)是一个值呀。Top
8 楼prettynacl(lulu)回复于 2003-08-05 09:58:09 得分 0
呵呵,建议多学习指针。
(char**)a的值还是a,只不过说明a是一个指向指针的指针。
如果
char **b = NULL;
x = (char**)a;
则:*(char**)a相当于*x
那么*x是什么,应该不难看出吧:
*x的类型是char *,即指向char的指针
你上面说的:
char(*a)
我不懂
Top




