C++中while循环判断为何需用*p而非直接用p?
关于指针遍历数组的循环条件疑问解答
为什么循环条件要用*p != NULL?
p是指针变量,它存储的是内存地址(比如数组第一个元素a[0]的地址)。*p是解引用操作,作用是取出p当前指向地址里存储的字符值。- 你的数组最后一个元素是
NULL(本质是数值0,对应C风格字符串的终止符'\0'),循环的目的是遍历数组中的每个字符,直到遇到这个终止符就停止。所以必须判断指针指向的内容是否为终止符,而非判断指针本身的地址是不是NULL。
为什么用while(p != NULL)会导致崩溃?
p != NULL是判断指针p自身存储的地址是不是空地址(地址0)。但数组在内存中是连续的一段空间,p++会让指针依次指向数组的下一个元素:a[0]→a[1]→a[2]→a[3]→a[4],之后继续p++,指针会指向数组外部的非法内存区域,这个地址永远不会等于NULL(除非意外访问到0地址,但这本身就是非法操作)。- 循环会无限执行,不断访问不属于程序的内存,触发内存访问错误,最终导致程序崩溃。
额外建议
在C++里用NULL表示字符终止符不太规范,NULL是为指针设计的宏,字符终止符用'\0'语义更清晰,建议把数组初始化代码改成:
char a[5] = {'a','a','c','a','\0'};
内容的提问来源于stack exchange,提问作者JohnyC
相关产品推荐
相关产品推荐

