鱼C论坛

 找回密码
 立即注册
查看: 2437|回复: 2

一道C语言二级的选择题(关于指针)

[复制链接]
发表于 2019-1-31 15:36:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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就停止循环了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-1-31 18:13:17 | 显示全部楼层
本帖最后由 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' 之前的字符进行计数,从而知道字符串长度的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-31 22:15:42 | 显示全部楼层
本帖最后由 行客 于 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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 06:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表