CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

一个很基础的指针问题,为什么非要转化为一个二级指针再转化为一级指针呀,才能?、请高手指教 、

楼主crcr(游侠)2003-08-02 12:54:27 在 C/C++ / C语言 提问

一个很基础的指针问题,为什么非要转化为一个二级指针再转化为一级指针呀,才能  
  例子:  
    #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

相关问题

  • 类指针的强制转化问题?
  • 大家关于二级指针
  • 二级菜单指针的获得!
  • 关于二级指针释放的BUG?
  • 二级指针 如何转换成 二维数组的指针?
  • 关于点的指针:从CPtrArray到LPPOINT怎样转化?
  • VC里怎样把句柄转化为指针?
  • 一个托管的类指针对象,能转化成void*吗?
  • 非字符串指针如何转化为数组使用?
  • 非字符串指针如何转化为数组使用?

关键词

  • 指针
  • 转化
  • 转换
  • 内容
  • 二级
  • 值
  • strcmp
  • 指向
  • 类型
  • 例子

得分解答快速导航

  • 帖主:crcr

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo