首先区分while( p )和while( *p )
p 是一个指针
while( p ) 判断的是指针 p 是否为0,也就是指针是否是空指针(int *p = 0;或 int *p = NULL;这时候的 p 就是空指针)
while( *p )判断的是指针 p 指向的地址的数据是否为0,也可以是 空字符’\0’
实验
while ( p )
const char ch[] = { 'H','e','l','l','o',};
const char *ptr = 0;
while (ptr) {
cout << "Hello" << endl;
}
cout << "over!" << endl;
输出的是
while ( *p )
const char ch[] = { 'H','e','l','l','o',};
const char *ptr = ch;
while (*ptr) {
cout << *ptr << endl;
++ptr;
}
cout << "over!" << endl;
输出的是Hello后面一堆乱码,因为字符数组 ch 没有以空字符结尾,*ptr 指向的地址变成数组以外的了,未知的内存空间里面什么值都可能有,然后一直循环,直到碰到一个值为0,才结束循环。程序每次运行的结果都可能不同
更有趣的是我发现指针指向未知区域时,用*p 去取值的时候,未知区域的数据会自动转换成指针的类型,上面我定义的指针类型是char,那么指针指向未知区域的值都会转换成char类型,下面是int型
int a[]{ 1,2,3 };
const int *ptr = a;
while (*ptr) {
cout << *ptr << endl;
++ptr;
}
cout << "over!" << endl;
我重复多次发现 -858993460 这个数多次出现,于是我就查了下C语言中 -858993460 的由来