C语言指针问题【精粹+附图】

运行的结果为什么是7,我觉得运行的结果应该是0啊
看我分析的有错吗:①:调用fun("0ABCDEF"),将字符串传递给s[]
②:在fun函数里面,char *p=s; 指针变量p指向s[]数组中的首个元素0;所以*p等于0
③p-s=0-0 等于0,
请问大神我①②③中的哪里错了?
最近考计算机二级,麻烦神的详细讲解。(详解,最好向我这样①②③这样的)
代码如下:
#include<stdio.h>
int fun(char s[])
{
char *p=s;
while(*p!=0)
p++;
return (p-s);
}
main()
{
printf("%d\n",fun("0ABCDEF"));
}

我是这样看的,画一个内存的存储结构图就好了:

1.字符串”0ABCDEF“在内存中的存储格式,如下图所示,当调用fun函数时,语句*p=s,表示将s指向的内存地址赋给了指针p,此时指针p和s都指向了堆栈顶部的地址 0000 0001。

2.在判断while(*p!=0)中,具体是判断p指向的字符与数字0之间的比较,显然,只有当p指向"\0'时,这个while循环才会结束,此时p的地址为0000 0008,但是s的地址依然在0000 0001,具体如下图所示:

3.因此,当执行return时,p-s的值就是0000 0008 - 0000 0001,显然结果就是7了。


当然,具体的地址肯定不是如此,不过应该不影响理解的。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-28
#include<stdio.h>
int fun(char s[])
{
 char *p=s;
 while(*p!=0)    //这里的0 转换成char就是'\0',而不是'0'
  p++;
 return (p-s);
}
main()
{
 printf("%d\n",fun("0ABCDEF"));//深刻的理解一下这里的字符串,字符串中字母的值
}
//字符串实际是"0ABCDEF\0",最后\0的值才是0,第一个0是'0',是48

追问

return (p-s) 为什么是7呢?

追答

0 A B C D E F \0
0 1 2 3 4 5 6 7
最后的时候p指向7 7- 0等于多少?

追问

①这里的s为什么是0呢? s是值为0吗?
②*p=s 怎么理解呢?

第2个回答  2014-02-28
*p!=0等价于*p!='\0',不等价于*p=='0',所以p指向s[]的第一个元素时并不结束循环
相似回答