测试用的是2019.02Clion编辑器
简要回答
while(*p)指的是当p指向的数值不为0,或者不为’\0’时执行操作。相当于while(*p!=0||*p!=’\0’)
while( p)指的是当p存在指向时执行操作。(这个是根据结果推测的结论,分析过程和测试代码如下,如有不对,还望指正!)
测试代码
#include <iostream>
using namespace std;
char a[6]="a\0p0l",*p;
int main() {
p=a;
cout<<"while(*p): ";
while(*p){
cout<<*p++<<'\t';
}
cout<<"while(p): ";
p=a;
// while(p){
// cout<<*p++<<'\t';
// }
//会出现不断循环的情况,为保证安全,用下面这种方法限制输出
for(int i=0;i<10;i++){
if(p){
cout<<*p++<<'\t';
}
}
return 0;
}
输出:
while(*p): a while(p): a p 0 l
分析:
- *p遇到’\0’后跳出了循环,但p没有,并且在这种情况下,if( p)仍判断为真,因为从a与p的间隔可以看出是两个’\t’。
- p遇到0的时候,if( p)依然判断为真
- 若不控制输出,使用while( p),会发现进入无限循环,说明while( p)一直判断为真
- *p遇到0时经测试也会停止
对于整型数组:
int a[6]={1,6,2,3,4,5},*p;
int main() {
p=a;
cout<<"if(*p): ";
// while(*p){
// cout<<*p++<<'\t';
// }
for(int i=0;i<10;i++){
if(*p){
cout<<*p++<<'\t';
}
}
p=a;
cout<<"if(p): ";
// while(p){
// cout<<*p++<<'\t';
// }
for(int i=0;i<10;i++){
if(p){
cout<<*p++<<'\t';
}
}
return 0;
}
输出:
if(*p): 1 6 2 3 4 5 if(p): 1 6 2 3 4 5 0
0 4206120 0
分析:
- 虽然整型数组结尾没有’\0’结束符,但是*p依然会终止。p也依然会越界。
- 经测试,*p遇到0也会终止,p依然不会。
小总结
在使用指针遍历数组时,用while(*p)会比while( p)安全很多。虽然不知道为什么无论怎样while( p)都会越界,也有可能不同编辑器会有不同结果?本人知识水平有限,不能很好地解释其中原因。如果哪位大神知道的希望可以告诉我hhhh,还有如果文章有哪里不对的,也希望大家能够批评指正,毕竟我也只是一只小白,还需要多多改进。