一个关于指针的面试题,会者请进。
一个面试题(代码如下):
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




