CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

一个关于指针的面试题,会者请进。

楼主fansgq()2006-07-18 18:00:46 在 C/C++ / C++ 语言 提问

一个面试题(代码如下):  
   
  char*   s   =   "ABC";  
  //intopr(s);   //不知道函数干什么的(知道的请告知),先屏蔽  
  *p   =   s;           //这里出错了(cannot   convert   from   'char   *'   to   'char')  
  while(*p!='0')  
        p++;  
  return(p   -   s);  
   
  请问,怎样定义p使得上面的代码不用改可以通过。  
  另外,这段代码究竟是返回什么?是字符串相减还是字符串地址相减还是其他????  
   
  另:题是我朋友给我的,可能不全,但只有那么多,我看不出结果,希望有高手能解答。 问题点数:100、回复次数:76Top

1 楼bristy(一踏糊涂)回复于 2006-07-18 18:07:28 得分 0

char   *p=s;Top

2 楼a_b_c_abc6(◥ @^@◤业余爱好而已)回复于 2006-07-18 18:08:53 得分 0

*p   =   s;           //从这句看见应是char**   p;  
  while(*p!='0')//但从这句看见应是char*   p;  
  矛盾  
  Top

3 楼jinweifu(浪萍飘影)回复于 2006-07-18 18:12:22 得分 0

cannot   convert   from   'char   *'   to   'char'     说明上面已经char   *p;了吧     只要把*p   =   s;星号去了就可以了Top

4 楼a_b_c_abc6(◥ @^@◤业余爱好而已)回复于 2006-07-18 18:21:22 得分 0

如果是这样,就是返回串s的长度。  
   
  char   *p   =   s;            
  while(*p!='0')  
        p++;  
  return(p   -   s);Top

5 楼fansgq()回复于 2006-07-18 18:21:45 得分 0

其实我测试的时候的确也是定义的char*   类型,因为我也不知道这里的p的类型,加一句   char   *p的语句时出现的错误提示。只是即使是定义的char*类型但最后返回的是地址差。  
   
  面试要的应该是个确定的结果吧?  
   
  Top

6 楼fansgq()回复于 2006-07-18 18:24:26 得分 0

我在机上得到的却是0x000000a8Top

7 楼quziao()回复于 2006-07-18 18:31:33 得分 0

char   *s="abc";  
      char   *p=s;  
      while(*p!='\0')  
      {  
      p++;  
      }  
   
      printf("\r\n%d\r\n",(p-s));  
      return   (p-s);  
   
   
  得到自然是字符串的长度了。Top

8 楼huhuan13201()回复于 2006-07-18 18:33:27 得分 0

应该定义为char**pTop

9 楼quziao()回复于 2006-07-18 18:39:49 得分 0

那上面的程序运行一下就知道了。Top

10 楼fansgq()回复于 2006-07-18 18:40:57 得分 0

字符串的长度好象也太长了吧,有32啊,而且无法从代码中看出来是32。Top

11 楼quziao()回复于 2006-07-18 19:03:11 得分 0

printf("\r\n%d\r\n",(p-s));  
   
   
  它的结果是32??????????????????????Top

12 楼seacher()回复于 2006-07-18 19:04:39 得分 0

*p=s;->char   *p=s;Top

13 楼jinweifu(浪萍飘影)回复于 2006-07-18 19:04:44 得分 0

那个不是得到字符串的长度     应该是遇到字符0的间距吧     不知道intopr(s);   什么用Top

14 楼a_b_c_abc9(◥ @^@◤业余爱好而已)回复于 2006-07-18 19:22:43 得分 0

如果是这样,就是返回串s的长度。  
   
  char   *p   =   s;            
  while(*p!='0')  
        p++;  
  return(p   -   s);  
  =====================  
  中招,'0'与'\0'不同Top

15 楼netxuning(大字报写手)回复于 2006-07-18 19:24:45 得分 0

关注.Top

16 楼fansgq()回复于 2006-07-18 20:04:52 得分 0

终于知道了,答案4,但怎么得到的,不清楚,应该是intopr(s);   有问题吧。  
  我只猜对了结果,但不知道过程。gf.Top

17 楼neoadane(乌云)回复于 2006-07-18 20:38:32 得分 0

如果把*p   =   s;改为char   *p=s;  
  返回结果是个随即值,即p一直递增到内存中值为'0'为止。Top

18 楼YeTimmy()回复于 2006-07-18 20:57:31 得分 0

你是不是写错了,是*p   !=   '\0'才是吧,要不然就是个随机值了  
  是的话那就:)  
  char   *p   =   s;  
  返回两指针中间的类型个数,结果是4;Top

19 楼bombwang(王)回复于 2006-07-18 22:25:42 得分 0

返回字符串长度的把Top

20 楼rollor_phoe(柔枫)回复于 2006-07-18 22:42:15 得分 0

程序应该是这样的吧:  
   
  char*   s   =   "ABC";  
  //intopr(s);    
  char   *p   =   s;         //这里改一下,加入定义    
  while(*p!='\0')   //测试有没有到字符串尾部  
        p++;  
  return(p   -   s);  
  Top

21 楼waywei()回复于 2006-07-19 09:58:04 得分 0

题目有问题,不能确保题目是否正确,讨论无意义  
  要是说只能更改p的定义的话,就不可以改成cha   *p=s;不合题意啊  
  应该只能改成char   **p,下面不变,才不会报错。  
  至于'0'还是'\0'谁知道是哪个个要是‘0‘的话返回结果没意义,要是'\0'返回的就应该是地址差了。  
  要是改成char   *p=s,后面的是'\0'那就是字符串长度Top

22 楼chenfanwen(非凡)回复于 2006-07-19 10:44:52 得分 0

应该是指针的指针Top

23 楼zmt1030()回复于 2006-07-19 11:00:30 得分 0

upTop

24 楼UPCC(杂食动物)回复于 2006-07-19 11:21:55 得分 0

char*   s   =   "ABC";  
  char   *p   =   s;  
  while(*p!='\0')//'0'-->'\0'正确得到大小  
   
   
   
  另外,这段代码究竟是返回什么?是字符串相减还是字符串地址相减还是其他????  
  -------------------------------------------------------------------------  
  其实不是地址相减,而是获取有多少个单位(这个单位的类型可以是struct,class,doule,int等等)数量差。//我中文差!  
   
  比如  
  struct   DD{  
  int   i;  
  int   j;  
  };  
  DD*   s   =   new   DD;  
  DD*   p   =   s;  
  p++;  
  printf("%d",p-s);  
  这里如果是地址相减的话,至少为8个字节的位数(32位机器),但结果却是1,所以不是地址相减Top

25 楼hxshxs(bill huang)回复于 2006-07-19 13:06:00 得分 0

返回字符串的长度Top

26 楼ROCKET001()回复于 2006-07-19 13:18:23 得分 0

别吵了,我来说一句,应该是intopr(s);   改变了*S,我才是在*s后加了‘0’进去,所以的到的4,我只是根据顶楼的结果猜的,如果题目没写错就是这样了。  
  还有*p的错误是没法改的(相互矛盾)。Top

27 楼CLOSING()回复于 2006-07-22 01:25:38 得分 0

题目无误的话,应该是这样:  
          char*   s   =   "ABC";  
          //intopr(s);     //函数功能应该是把'\0'转换为以'0'结尾  
          char   **p   =   s;   //char   **p  
          while(*p!='0')//intopr(s)确保能正确运行  
                  p++;             //得到长度  
   
          return(p   -   s);   //地址之差  
     
  在cl中编译得到13,这样就是在计算地址之差.Top

28 楼Akitce()回复于 2006-07-25 12:56:36 得分 0

学习Top

29 楼bombwang(王)回复于 2006-07-25 21:48:29 得分 0

char   p=s;  
  p-s返回的是字符串的长度Top

30 楼1073X(爱着未知数)回复于 2006-07-29 21:55:55 得分 0

如果是C89  
  char   *s   =   "ABC";  
  intopr(s);  
  char   *p   =   s;  
   
  这样解是编译不过的.  
   
  Top

31 楼guo0084(alre)回复于 2006-07-30 09:53:45 得分 0

char*   s   =   "ABC";  
  //intopr(s);    
  char   *p   =   s;   //p是char*  
  while(*p!='0')   //这个是'0'字符,不是字符串结束的0值,这个循环就是在内存从p开始里找到第一个'0'字符  
        p++;  
  return(p   -   s);  
   
  Top

32 楼xing2013517()回复于 2006-07-30 10:15:52 得分 0

来这看大家讨论收获实在不少啊。  
  我会经常来的。  
           
  Top

33 楼xidaoqiong1985()回复于 2006-07-30 10:42:03 得分 0

在Dev-cpp编译器中不需要itopr(s)也可以编译通过,而且while循环中的判断条件可以为*P!=0;因为在标准C++初始化一个字符串会以'0'作为一个字符串的结束符号.Top

34 楼meloncocoo(●冬瓜oοО)回复于 2006-07-31 16:41:57 得分 0

char   **p;Top

35 楼coziness(coziness)回复于 2006-09-28 17:37:02 得分 0

quziao()   (   )   信誉:100         Blog     2006-7-18   18:31:33     得分:   0      
     
     
         
  char   *s="abc";  
      char   *p=s;  
      while(*p!='\0')  
      {  
      p++;  
      }  
   
      printf("\r\n%d\r\n",(p-s));  
      return   (p-s);  
   
   
  得到自然是字符串的长度了。  
   
       
    =============  
  赞同这一说法Top

36 楼viornment()回复于 2006-09-28 17:52:09 得分 0

char   *s="abc";  
  char   *p=s;  
  while(*p!='\0')  
  {  
  p++;  
  }  
   
  printf("\r\n%d\r\n",(p-s));  
  return   (p-s);  
   
   
  得到自然是字符串的长度了。  
   
  ________________________________  
  这个解释是正确的,运行结果是3,也就是字符串的长度.  
  至于上面说的:char   **p   =s;  
  这样是不能通过编译的,因为S是char   *,而p这里定义为**,那么怎么还能将S赋给P呢?????  
  Top

37 楼Airway1314()回复于 2006-10-18 13:03:01 得分 0

20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!v  
   
  v  
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!vv20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!v  
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
   
  20152522         .NET开发俱乐部给IT工作者提供交流平台,实现资源互补,共同进步!欢迎有开发经验者加入探讨!  
   
   
  Top

38 楼jackeylovecathy()回复于 2006-10-22 15:01:09 得分 0

小弟正在学习编程没有多久刚刚开始有些感觉   对指针不是很理解,刚刚看了上面的讨论有题很多地方不是很理解     但是后面的WHILE循环里面是什么意思呢   老师说字符串里以0做为结束   但是*P!='0'的意思好象不是测试到没到字符串尾部似的   还有返回值那里   返回到底是个地址差呢还是里面类型的个数   我今天想去问老师但是老师不在   请各位帮我.感激不尽Top

39 楼brookqdc(小溪)回复于 2006-11-01 18:04:48 得分 0

char   *s="abc";  
  char   *p=s;  
  while(*p!='\0')  
  {  
  p++;  
  }  
   
  printf("\r\n%d\r\n",(p-s));  
  return   (p-s);  
   
  得到自然是字符串的长度了。  
   
  ______________________________  
  这个解释是正确的,运行结果是3,也就是字符串的长度.  
  至于上面说的:char   **p   =s;  
  这样是不能通过编译的,因为S是char   *,而p这里定义为**,那么怎么还能将S赋给P呢?????  
   
  /////////////////////  
   
  赞成上述说法!!  
   
  应该不是**,如果是,则应该   char   **p   =&s;  
   
  而这样的话,*p=指针s的内容了。  
  Top

40 楼jiefangtw(共产主义的实现从网络共享开始)回复于 2006-11-09 17:43:20 得分 0

得到s指针指向的东东里第一次出现‘0’的位置Top

41 楼zkkpkk(菜鸟爱GDI)回复于 2006-11-09 20:59:10 得分 0

p是地址*p是数据Top

42 楼hudinho()回复于 2006-11-09 21:25:39 得分 0

#include   <iostream>  
    main()  
    {  
        char   *s="ABC";  
        char   *p=s;  
        while(*p!='\0')  
          {  
                  p++;  
          }  
   
      cout<<"(p-s)=   "<<(p-s)<<endl;  
    }  
   
  运行结果:   (p-s)=   3   ~~  
  Top

43 楼hudinho()回复于 2006-11-09 21:31:26 得分 0

p补充:   当   char   *s="ABCdef";的时候    
                  运行结果:   (p-s)=   6   ~~!  
   
    是否可得出:   返回的是字符串的张?Top

44 楼zhaoyc59211()回复于 2006-11-10 10:28:27 得分 0

char   *s="abc";  
  char   *p=s;  
  while(*p!='\0')  
  {  
  p++;  
  }  
   
  printf("\r\n%d\r\n",(p-s));  
  return   (p-s);  
   
   
  得到自然是字符串的长度了。  
   
  ________________________________  
  这个解释是正确的,运行结果是3,也就是字符串的长度.  
  至于上面说的:char   **p   =s;  
  这样是不能通过编译的,因为S是char   *,而p这里定义为**,那么怎么还能将S赋给P呢?????  
  ________________________________  
  同意此说法.Top

45 楼roydux(后台运行中-http://www.LeadNT.org 大家一起来写吧)回复于 2006-11-10 14:24:01 得分 0

*p   =   s;      
   
  这个好象取的是内存的地址....  
   
  Top

46 楼Fantasy_mysky()回复于 2006-11-15 16:46:26 得分 0

void   main()  
  {  
  char   *s   =   "abc";  
  intopr(s);  
  char   *p   =   s;  
  while(*p!='0')  
  p++;  
  cout   <<   (p-s)   <<   endl;    
  }  
  p最后应该是指向'\0'之后,s   指向开头第一个,向减就是长度。Top

47 楼OOPhaisky(异化$渴望成功~~)回复于 2006-11-15 17:55:15 得分 0

支持一下^_^Top

48 楼MeE(巴顿)回复于 2006-11-15 21:10:20 得分 0

char   **   p   ;  
  p   =new   char[1];  
  *p=s;Top

49 楼lxhtzy(天之翼)回复于 2006-11-15 23:35:14 得分 0

 
  char   *s="abc";  
      char   *p=s;  
      while(*p!='\0')  
      {  
      p++;  
      }  
   
      printf("\r\n%d\r\n",(p-s));  
      return   (p-s);  
   
   
  得到自然是字符串的长度了。  
  --------------------  
  同意Top

50 楼hiox_ppl(ranger)回复于 2006-11-20 11:19:30 得分 0

char   *s="abc";  
  char   *p=s;  
  while(*p!='\0')  
  {  
  p++;  
  }  
   
  printf("\r\n%d\r\n",(p-s));  
  return   (p-s);  
   
   
  得到自然是字符串的长度了。  
  --------------------  
  支持Top

51 楼OnlySmile()回复于 2006-11-20 11:53:22 得分 0

得到字符串长度Top

52 楼hwpass()回复于 2006-11-20 15:50:53 得分 0

markTop

53 楼haoyue0603(佛)回复于 2006-11-20 16:27:48 得分 0

char*   p   =   s;  
   
  返回字符串长度Top

54 楼lose_forest(无名小卒)回复于 2006-11-21 08:58:35 得分 0

返回的是字符长度      
  PS:你的P是什么地方来的?很明显他说类型不匹配么   也就是说你那屁定义有错误Top

55 楼arust(清楚)回复于 2006-11-21 15:16:01 得分 0

好烂的面试题,返回字符串的长度写这么复杂干吗?Top

56 楼feifeiyaqi(yaqi)回复于 2006-11-27 15:26:39 得分 0

upTop

57 楼macnab()回复于 2006-11-27 18:26:24 得分 0

他让你得到是那个未知函体用多少内存堆.Top

58 楼qiujie01()回复于 2006-11-30 17:20:03 得分 0

I   knowTop

59 楼qiujie01()回复于 2006-11-30 17:22:28 得分 0

opTop

60 楼qiujie01()回复于 2006-11-30 17:22:55 得分 0

lpTop

61 楼shawnwan()回复于 2006-11-30 17:32:18 得分 0

EASYTop

62 楼yydy1983(游泳的鱼)回复于 2006-12-01 17:11:07 得分 0

char   *p;  
  p=s;Top

63 楼zlycau(代码大盗)回复于 2006-12-08 08:19:59 得分 0

char   *p=s;Top

64 楼czdj2000(MSN:czdj2000@hotmail.com)回复于 2006-12-09 20:10:35 得分 0

char   *p=s   的话   那么*p不就是字符串的地址吗   那p值是什么呢  
  望指点Top

65 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2006-12-10 00:11:31 得分 0

*p是字符串的第一个字母,p才是地址Top

66 楼newline2000(修改你在CSDN社区的信息)回复于 2006-12-10 17:53:51 得分 0

p=s  
  Top

67 楼liujianghongcc()回复于 2006-12-10 22:59:56 得分 0

char*   s   =   "ABC";  
  //intopr(s);   //不知道函数干什么的(知道的请告知),先屏蔽  
  *p   =   s;           //这里出错了(cannot   convert   from   'char   *'   to   'char')  
  //   *p=*s   把   s   里的东西给   p   如果   p=s     那就是   把p   指向   s   的地址   看情行   应该是前者  
  while(*p!='0')  
        p++;     //   这里说明   p   在前面已经定义   而不是在这里定义   而且p   是   一个指针数组其中的一个指针  
                              p++   是把   p   指向下一个指针  
  return(p   -   s);     指针相减   应该是一个数     也可以看函数的返回值是什么类型   就知道Top

68 楼lijielinjun(下天林君)回复于 2006-12-11 12:08:07 得分 0

char   *s="abc";  
  char   *p=s;  
  while(*p!='\0')  
  {  
  p++;  
  }  
   
  printf("\r\n%d\r\n",(p-s));  
  return   (p-s);  
   
   
  得到自然是字符串的长度了。  
   
  ________________________________  
  这个解释是正确的,运行结果是3,也就是字符串的长度.  
  至于上面说的:char   **p   =s;  
  这样是不能通过编译的,因为S是char   *,而p这里定义为**,那么怎么还能将S赋给P呢?????  
  ________________________________  
  同意此说法.  
  Top

69 楼wantjutju()回复于 2006-12-16 11:38:29 得分 0

cout   <<   int('\0')   <<   endl   <<   int('0')   <<   endl;  
   
  输出为  
  0  
  48  
   
  so俺认为本程序不能给出的字符串的茶馆年度Top

70 楼hardmy()回复于 2006-12-19 15:27:28 得分 0

char   *p   =   "ABC"   这也行?  
  Top

71 楼snookermx()回复于 2006-12-19 15:41:49 得分 0

我觉得也是char   **   ,  
  Dx里有很多**啊,对指针都是这样赋值的。Top

72 楼snookermx()回复于 2006-12-19 15:49:53 得分 0

对哦,如果是char**   ,后面应该是char**   p   =   &s;才对嘛。  
  Top

73 楼hsyouxishe(金笛玉洁)回复于 2006-12-19 16:45:07 得分 0

楼上的有个不是去问你们老师了吗?  
  你们老师怎么说的啊?Top

74 楼roydux(后台运行中-http://www.LeadNT.org 大家一起来写吧)回复于 2006-12-19 16:58:20 得分 0

p   =   s;Top

75 楼yzcurry(什么都不会)回复于 2006-12-19 17:16:58 得分 0

while(*p!='0')  
        p++;  
  这个执行的结果很难预料的  
  因为while(*p!='0')中的*p植真的很难确定  
  因此这句话本身就有问题  
  应该改成while(*p!='\0')  
  还有它的结果应该是这样的话,这个结果就是p指针相对于s的偏移量Top

76 楼boy5d(博爱天下)回复于 2006-12-19 18:12:32 得分 0

不懂就来学习了?!Top

相关问题

关键词

得分解答快速导航

  • 帖主:fansgq

相关链接

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

广告也精彩

反馈

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