一道C语言二级的选择题(关于指针)
#include<stdio.h>int fun(char s[])
{
char *p=s;
while(*p!=0)
p++;
return (p-s);
}
void main()
{
printf("%d\n",fun("0ABCDEF"));
}
//它的答案为什么会是7呢???
//不应该遇到第一个0就停止循环了吗 本帖最后由 jackz007 于 2019-1-31 18:33 编辑
fun() 的作用实际上就是 strlen(), 你给出的字符串 "0ABCDEF" 是一个 7 个字符长度的字符串,所以,显示 7。
你有一点概念混淆,字符串 "0ABCDEF" 中的每一个字符都有自己不为 0 的编码值,比如,首字符 '0' 的编码是 48(0x30)而不是 0,第 2 个字符 'A' 的编码值是 65 , 只有位于字符串末尾的结束标志字符 '\0' 编码值才是 0,当然,这个字符我们是不可见的。
所以,传给 fun()的字符串 "0ABCDEF" 实际上是这个样子:
'0' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , '\0'
fun()便是通过对标志符 '\0' 之前的字符进行计数,从而知道字符串长度的。 本帖最后由 行客 于 2019-1-31 22:24 编辑
假如代码为:
while(*p!='0')
而不是你发的代码
while(*p!=0)
那么,你说的对,应该遇到第一个'0'就停止循环了。
但实际的情况是,
"0ABCDEF"中的'0'是带单引号的char类型的字符'0'【注意:'0'编码是10进制的 48(16进制为0x30),而不是 0)】,而非0。
注意,这里我们所说到的不带单引号的0,并非是int类型的整型数字0,而是ASII编码为10进制 0 (16进制也为0)的char类型字符'\0'。
为什么不是数字0?是因为和这个0比较的是*p,*p是一个char类型字符,所以0就非是整型数字0了,而是编码为0的char类型字符'\0'了。
所以,因为字符串"0ABCDEF"里的'0'的编码是10进制48,和'\0'的10进制不带单引号的0比较自然不相等。
好了,如果明白了上面的内容,我们来继续分析while(*p!=0)的循环体到什么时间才结束循环:
传给int fun(char s[]);函数的字符串 "0ABCDEF" 实际上是这个样子:
char s[]={ '0' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , '\0' };
fun()函数是通过对标志符 '\0' 之前的字符进行计数,不包括最后的'\0',得到字符串长度。因此结果为7。
页:
[1]