C语言:求解答,感觉答案不对啊,我觉得选C.怎么选A啊?

t-s是两个地址相减,减出来的应该是一个地址差啊,应该选C才对啊,怎么选A???编写了代码:#include<stdio.h>#include<string.h>intm... t-s是两个地址相减,减出来的应该是一个地址差啊,应该选C才对啊,怎么选A???
编写了代码:
#include<stdio.h>#include<string.h>int main(){int fun(char *s);char a[20]="123456";printf("%d",fun(a));

}
int fun(char *s){ char *t=s; while(*t++); return (t-s);}

可见A明显不对啊,如果是字符串长度,那么应该输出6啊
展开
 我来答
zhzht_2008
2013-03-31 · TA获得超过2112个赞
知道小有建树答主
回答量:522
采纳率:100%
帮助的人:239万
展开全部
先来搞清楚字符串长度和字符串占用内存字节的区别:
《C和指针》第九章<字符串,字符和字节>175页中,作者Kenneth A Reek说:NULL字符是字符串的中止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NULL字节。所以字符串长度所表示的字节数加上一,才等于该字符串所占用的字节数.
我认为关键在于编译器怎么翻译while(*t++)这句代码
首先,运算符*和++具有相同的优先级段,但是由于他们是从右向左结合的,所以该句代码实际上是:*(t++),即先执行t++,但是又因为运算符++是"后计算",所以这句代码执行用汉语来说大概就是:先取指针t指向的字符,然后t指向下一个字符.
我用keil mdk编译器做了测试,while(*t++)这句代码翻译成汇编代码如下所示:
//while(*t++);
NOP
LDRB r3,[r2],#0x01
CMP r3,#0x00
BNE 0x000001A2
即先将寄存器r2中值所在的地址的数据放到寄存器r3中,然后r2的值加1,然后比较r3和0是否相等,在keil mdk编译器下测试字符串"123",返回值为4,也就是C选项是对的
但是,keil mdk对应的是ARM架构处理器,不排除在PC中编译器将while(*t++)成别的
希望你自己在PC上也做一下测试
相信你自己,不管是不是选C,我想你对指针和字符串操作都有了新的认识了,这已经是非常好的答案了.
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
戚文柏Ro
2013-03-31 · TA获得超过336个赞
知道小有建树答主
回答量:400
采纳率:100%
帮助的人:399万
展开全部
字符占一个字节 同类型指针相减=地址之差/类型所占字节
追问
减出来的应该是地址差,也就是那段东西占多少个字节,然后除以char型变量所占字节数才应该是字符串长度啊,因为1个char字符占1个字节,所以A恰好对了,但是觉得C更对啊
追答
char *a="123465";
char *p=a,*q=a+5;
int x;
x=q-p;
printf("x=%d",x);

你理解错啦,地址相减是值这个数组所占类存大小 但指针相减是指数组元素多少
同一个数组,指针指向的是上一个元素或下一个元素
指针是指向内存地址的变量
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天涯夏学长
2013-03-31 · TA获得超过1868个赞
知道小有建树答主
回答量:259
采纳率:100%
帮助的人:146万
展开全部
减出来的地址差不就是字符串长度吗 到c贴吧问下吧
追问
C语言吧吗?算了吧,去发了几次贴都被删了,一群傻b吧务,

减出来的应该是地址差,也就是那段东西占多少个字节,然后除以char型变量所占字节数才应该是字符串长度啊,因为1个char字符占1个字节,所以A恰好对了,但是觉得C更对啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式