当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 今天我在装系统时,在刚开始的 检测完后,提示“没有足够的常规内存”,我用的是一种带很多启动工具的那种启动盘(有分区工具,还有其他的,有1到6的大项目,我想有些人应该用过这种盘的),但我有换了一种启动盘后(以前的那种,启动以后直接进入a:这种命令符下的),就能安装了,请问这是怎么回事? ......
    摘要: 大部分单词都知道什么意思,不过,整段话我就是不理解,不知道说了什么? if your application uses mfc in a shared dll, and your application is in a language other than the operating systems current language, you will need to copy the ......


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

#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   );  
 

NO.1   作者: bnu381005

我也说不大明白,可是你那个好像的确是错的,(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中要使用二级指针。

NO.3   作者: wshcdr

mark

NO.4   作者: wenj

开始,我也觉得搂主改写后没什么问题。调试后才搞懂。上面两位说的都对。  
  首先,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   的值就明白了.  
 

NO.5   作者: wenj

上面有个地方写错了.  
  compare3()中的a,b   是&list[i]的地址。  
  应该是compare3()中的a,b   是&list[i]的值。  
   
 

NO.6   作者: weibz0525

由于list是指针数组,一几指针指向的是各个数组元素地址,而二几指针才指向数组元素中字符串的首地址。

NO.7   作者: wenj

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指针吧.都是对指针的理解问题.  
   
   
   
 


 ·请各位指点    »显示摘要«
    摘要: 如何将string值转换为char值? 还望各位指点! ......
» 本期热门文章:
· 热门栏目:
» 相关精选文章
» 其它相关:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE