You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

技术问询: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

火山引擎 最新活动