while(*p)陷阱,出错,乱码

首先区分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 的由来

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值