技术问询:if(!pointer)与if(!*pointer)条件判断的区别是什么?
嘿,这个问题问到点子上了!搞懂这两种判断的差异,是避开C/C++指针坑的关键一步,我给你拆解得明明白白:
通用场景下 if(!pointer) 和 if(!*pointer) 的区别
if(!pointer):检查指针本身是否为空
这里的pointer是指针变量自己,判断的是它存储的地址是不是空地址(也就是NULL或者nullptr)。打个比方:就像你手里拿了个快递单号,这个判断是看你手里有没有单号——连单号都没有,根本没法去取快递。
换句话说,当指针本身是无效的、没有指向任何内存地址时,这个条件就会成立。if(!*pointer):检查指针指向的内容是否为“逻辑假”
这里的*pointer是对指针进行解引用操作,拿到指针指向的内存里的实际值,然后判断这个值是否等价于逻辑假(比如数值0、空指针NULL、布尔值false,或者空字符串这类会被隐式转为假的内容)。还是用快递的例子:你手里有有效的单号(指针非空),这个判断是看你取到的快递盒子里有没有东西——如果盒子是空的,或者装的是无效物品,条件就成立。
针对你给出的代码片段分析
先把代码贴出来方便对照:
const MyStruct* MyClass::MyMethod(void* *iter) { if (!iter) return NULL; if (!*iter) { // ... } }
这里的iter是个二级指针(指向void*类型指针的指针),两个判断的差异更明确:
第一个判断
if(!iter):检查的是这个二级指针本身是否为空。意思是调用MyMethod时,传入的参数是不是一个空指针——比如调用方传了NULL或者nullptr,那iter本身就是无效的,直接返回NULL。类比成:别人要给你一个装快递单号的文件袋,这个判断是看文件袋有没有给到你——连文件袋都没有,直接返回。第二个判断
if(!*iter):这里的*iter是解引用二级指针,拿到它指向的那个void*指针,然后判断这个void*指针是否为空。也就是文件袋是有的(iter非空),但打开文件袋看里面的快递单号是不是无效的(空单号),如果是,就执行后面的代码块。
内容的提问来源于stack exchange,提问作者user8398347




