/* HELLO.C -- Hello, world */
#include "stdio.h"
#include "conio.h"
#include<string.h>
main()
{ char c,s[20],*p=s;
int n=1;
printf("input zifuchuan\n");gets(s);
printf("zifu\n");
c=getchar();
while(*p)
{if(*p==c)break;
p++;n++;
}
if(*p)
printf("字符%c首次出现在字符串%s的第个%d位置。\n",c,s,n);
else
printf("字符%c未在字符串%s中出现\n",c,s);
printf("Hello, world\n");
getch();
}
其中while(*p)和if(*p)中的*p是什么意思?
其实,楼主不明白的是:
1. if()或 while()后面的表达式是什么?
答案是: 从C语法的角度,if()或 while()后面的表达式是什么都可以。运行时(应该是编译时编译成这样子),先求整个表达式的值。结果是一个数值。 C吧这个数值看成逻辑值:白话的说,就是,如果这个值是0,就认为是 假(False),除0之外,都是真(TRUE)。
如果是真,执行接下来的代码块,否则跳过。
你可以直接写 if(i),而不必写 if(i != 0 )
2. 那么再看具体代码,while(*p)和if(*p)中的*p是什么意思?:就是判读*p是不是0 呗。楼主不了解的是,*p什么时候是0??
您需要知道:C语言字符串以0结束。
也就是说,您写 *p = "input zifuchuan";时 ,实际存内存存放的是:
‘i’ ‘n’ ‘p’ ‘u’ ‘t’ ‘ ’ ‘z’ ‘i’ ‘f’ ‘u’ ‘c’ ‘h’ ‘u’ ‘a’ ‘n’ 0
while(*p)的意思,翻译过来就是:”当p指向的字符串没有到达结束的0时“
注意:循环体里。必然有p++的移动操作
‘i’ ‘n’ ‘p’ ‘u’ ‘t’ ‘ ’ ‘z’ ‘i’ ‘f’ ‘u’ ‘c’ ‘h’ ‘u’ ‘a’ ‘n’ 0
^ ^
| |
p -------------------------------------------> p
1. if()或 while()后面的表达式是什么?
答案是: 从C语法的角度,if()或 while()后面的表达式是什么都可以。运行时(应该是编译时编译成这样子),先求整个表达式的值。结果是一个数值。 C吧这个数值看成逻辑值:白话的说,就是,如果这个值是0,就认为是 假(False),除0之外,都是真(TRUE)。
如果是真,执行接下来的代码块,否则跳过。
你可以直接写 if(i),而不必写 if(i != 0 )
2. 那么再看具体代码,while(*p)和if(*p)中的*p是什么意思?:就是判读*p是不是0 呗。楼主不了解的是,*p什么时候是0??
您需要知道:C语言字符串以0结束。
也就是说,您写 *p = "input zifuchuan";时 ,实际存内存存放的是:
‘i’ ‘n’ ‘p’ ‘u’ ‘t’ ‘ ’ ‘z’ ‘i’ ‘f’ ‘u’ ‘c’ ‘h’ ‘u’ ‘a’ ‘n’ 0
while(*p)的意思,翻译过来就是:”当p指向的字符串没有到达结束的0时“
注意:循环体里。必然有p++的移动操作
‘i’ ‘n’ ‘p’ ‘u’ ‘t’ ‘ ’ ‘z’ ‘i’ ‘f’ ‘u’ ‘c’ ‘h’ ‘u’ ‘a’ ‘n’ 0
^ ^
| |
p -------------------------------------------> p
温馨提示:答案为网友推荐,仅供参考
第1个回答 2012-05-13
相当于*p!=null,意思就是p指向的内容不为空
第2个回答 2012-05-13
在C语言中,这是字符串处理时常用的技巧。
这样写的程序最后的机器码很精简,充分利用到CPU本身的功能。
*p是当前p指向的字符,在字符串结尾,*p必为0。这时while或if都得出“假”,条件不成立。
不过必须指出,这样写有一个小漏洞,如果p为空指针时将出现非法操作。所以一般是这样写:
if(p&&*p)
while(p&&*p)
由于C对于逻辑操作是短路型的,所以这样就可避免对空指针的操作,程序将更加健康。
这样写的程序最后的机器码很精简,充分利用到CPU本身的功能。
*p是当前p指向的字符,在字符串结尾,*p必为0。这时while或if都得出“假”,条件不成立。
不过必须指出,这样写有一个小漏洞,如果p为空指针时将出现非法操作。所以一般是这样写:
if(p&&*p)
while(p&&*p)
由于C对于逻辑操作是短路型的,所以这样就可避免对空指针的操作,程序将更加健康。